51单片机入门 - 模拟PWM调制控制实验

博主福利:100G+电子设计资料合集icon-default.png?t=N7T8https://dwz.date/fyQa

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,电机转1ms停9ms。
  • 第三次按下按钮,n=2,占空比20%,P2.0低电平8ms,高电平2ms,电机转2ms停8ms。
  • ...
  • 十次循环过后n=0,重新开始

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

元件清单:

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

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

实现代码:

#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit PWM = P2 ^ 0;
uchar n = 0;
void Delay(uchar m)
{
    uchar a, b, c;
    while(m--)
        for (c = 19; c > 0; --c)
            for (b = 20; b > 0; --b)
                for (a = 130; a > 0; --a);
}
void PWMout(uchar n)
{
    PWM = 0; //先置PWM信号为低电平,此时可以看到在波形图上出现波峰
    Delay(10 - n); //延时10-n(ms)
    PWM = 1; //置PWM信号为高电平,此时波形图出现波谷
    Delay(n); //延时n(ms)
}
int main()
{
    EA = 1; //通过按钮中断来修改n的值
    EX0 = 1;
    IT0 = 1;
    while(1)
    {
        PWMout(n); //脉冲输出子程序
    }
}
void Int0()interrupt 0
{
    if (n == 10) //n在0-10中循环
        n = 0;
    else ++n;
}

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值