找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5154|回复: 0
收起左侧

单片机PWM波调速-按键实现速度加减 程序+视频

[复制链接]
ID:523178 发表于 2020-5-5 11:47 | 显示全部楼层 |阅读模式

  51单片机是可以输出PWM的,相对麻烦。此时需要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。

  用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。大致的的编程思路是这样的:T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。

  下面重点介绍用一个定时器的实现PWM的方法。以周期为0.1ms(10KHz)为例,要产生其它频率的PWM波,程序中只需作简单修改即可。用一个定时器时(如定时器T0),首先要确定PWM的周期T和占空比D,确定了这些以后,就可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则D*T=n*t,类似的可以求出PWM低电平时间需要多少个时间基准n。

下面的程序让51单片机产生一个100KHz的PWM方波,使用按键加减速度,在实际调试中,发现占空比D达到17%时即可转动,但是需要外力启动,此时转速最慢;在没有外力的情况下,占空比需要达到75%才可以转动,此时转速已经非常快;通过按键将占空比D调节到%17或%16时停止转动。占空比的值是LCD1602显示的。附上代码和演示视频链接:链接:https://pan.baidu.com/s/1BqV4morVQeHN2uTd89DRWw

提取码:kqew


单片机源程序如下:


  1. //12MHz的晶振,产生频率10KHz,占空比为x的PWM波
  2. #include "reg52.h"
  3. #include "lcd.h"
  4. typedef unsigned int u16;
  5. typedef unsigned char u8;

  6. sbit PWM_LED = P1^0;
  7. sbit KeyUp   = P2^0;
  8. sbit KeyDown = P2^1;
  9. u8 value = 1;
  10. u8 Br, Sr, Gr;
  11. u8 str[] = {"Moto Speed Trim"};
  12. u8 str1[] = {"PWM:"};
  13. void delay(u16 i)
  14. {
  15.         while(i--);
  16. }
  17. void Timer0_Init(void)
  18. {
  19.         TMOD |= 0x01;
  20.         TH0 = 0xFF;
  21.         TL0 = 0x9C;         //定时0.01ms
  22.         TR0 = 1;
  23.         ET0 = 1;
  24.         EA  = 1;
  25. }
  26. void datapros(u8 val)
  27. {
  28.         Br = val / 100 + 0x30;
  29.         Sr = val % 100 / 10 + 0x30;
  30.         Gr = val % 10 + 0x30;
  31. }

  32. void main(void)
  33. {
  34.         PWM_LED = 0;
  35.         Timer0_Init();
  36.         LcdInit();
  37.         while(1)
  38.         {
  39.                 if(KeyUp != 1)
  40.                 {
  41.                          delay(1000);
  42.                         if(KeyUp != 1)
  43.                         {
  44.                                
  45.                         }
  46.                         while(!KeyUp);
  47.                         value++;
  48.                         if(value == 100)
  49.                         {
  50.                                  value = 1;
  51.                         }
  52.                 }
  53.                 if(KeyDown != 1)
  54.                 {
  55.                          delay(1000);
  56.                         if(KeyDown != 1)
  57.                         {

  58.                         }
  59.                         while(!KeyDown);
  60.                         value--;
  61.                         if(value == 0)
  62.                         {
  63.                                  value = 1;
  64.                         }
  65.                 }
  66.                 datapros(value);
  67.                 LcdShowStr(0,0,str);
  68.                 LcdShowStr(0,1,str1);
  69.                 DisplayOneChar(5,1,Br);
  70.                 DisplayOneChar(6,1,Sr);
  71.                 DisplayOneChar(7,1,Gr);
  72.                 DisplayOneChar(8,1,'%');               
  73.         }        
  74. }
  75. void Timer0() interrupt 1
  76. {
  77.         static u8 time = 0;

  78.         TR0 = 0;  //关闭定时器
  79.         TH0 = 0xFF;
  80.         TL0 = 0x9C;        //重装初值
  81.         TR0 = 1;
  82.         time++;
  83.         if(time > 100)
  84.         {
  85.                  time = 0;
  86.         }
  87.         if(time < value)
  88.         {
  89.                  PWM_LED = 1;
  90.         }
  91.         else
  92.                 PWM_LED = 0;
  93. }
复制代码

所有程序51hei提供下载:

PWM波-按键控制电机速度.rar (18.75 KB, 下载次数: 44)

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表