zoukankan      html  css  js  c++  java
  • 51单片机 | 模拟PWM调制控制实验

    ————————————————————————————————————————————

    PWM(脉冲宽度调制)

    • 对模拟信号电平进行数字编码的方法

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    设计要求:

    • 由于AT89系列单片机没有PWM控制器,所以通过定时器产生PWM
    • 通过按钮控制P2.0输出高低电平的时间,占空比可调范围:0~100%,每次按下按钮以10%步进,通过示波器看到对应波形。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    电路功能:

    第一个放大器的作用是反相,将P2.0口输出的电压反相,得到一个绝对值相等的负电压。R1和R2阻止相同,不放大。

    第二个放大器的作用是放大电压,并再次反相。放大倍数是R4:R5=1000:100=10倍。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    实验现象:

    • 首次按下按钮时,n=0,占空比0%P2.0低电平10ms,高电平0ms,电机不转。
    • 第二次按下按钮,n=1,占空比10%P2.0低电平9ms,高电平1ms,电机转1ms9ms
    • 第三次按下按钮,n=2,占空比20%P2.0低电平8ms,高电平2ms,电机转2ms8ms
    • ...
    • 十次循环过后n=0,重新开始

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    元件清单:

    • BUTTON
    • AT89C51
    • MOTOR
    • RES,p.s.严格对应图中阻止
    • OPAMP
    • COUNTER TIMER,p.s.COUNTER TIMER(频率计)设置OperatingMode项为frequency
    • Digital Oscilloscope

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    实现代码:

     1 #include <reg52.h>
     2 typedef unsigned char uchar;
     3 typedef unsigned int uint;
     4 sbit PWM = P2 ^ 0;
     5 uchar n = 0;
     6 void Delay(uchar m)
     7 {
     8     uchar a, b, c;
     9     while(m--)
    10         for (c = 19; c > 0; --c)
    11             for (b = 20; b > 0; --b)
    12                 for (a = 130; a > 0; --a);
    13 }
    14 void PWMout(uchar n)
    15 {
    16     PWM = 0; //先置PWM信号为低电平,此时可以看到在波形图上出现波峰
    17     Delay(10 - n); //延时10-n(ms)
    18     PWM = 1; //置PWM信号为高电平,此时波形图出现波谷
    19     Delay(n); //延时n(ms)
    20 }
    21 int main()
    22 {
    23     EA = 1; //通过按钮中断来修改n的值
    24     EX0 = 1;
    25     IT0 = 1;
    26     while(1)
    27     {
    28         PWMout(n); //脉冲输出子程序
    29     }
    30 }
    31 void Int0()interrupt 0
    32 {
    33     if (n == 10) //n在0-10中循环
    34         n = 0;
    35     else ++n;
    36 }

  • 相关阅读:
    CPU使用率100%的一个原因
    Oracle 9.2.0.1升级到9.2.0.5
    Javacript同样的意思,更巧的写法
    前端面试题
    Linux shell
    vi/vim 光标移动命令
    CSS 中的分离、抽象和层叠
    practice first开张
    Linux下访问Windows的方法(原)
    Evolution收发Gmail邮件
  • 原文地址:https://www.cnblogs.com/hughdong/p/6901078.html
Copyright © 2011-2022 走看看