找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1622|回复: 8
收起左侧

单片机PWM输出按键不能控制

[复制链接]
ID:322939 发表于 2020-4-13 15:02 | 显示全部楼层 |阅读模式
各位大佬,请教下用一个定时器做PWM输出,按键控制时,如果定时器时间设5US初值(即200KHZ频率时),按键不能控制PWM停止输出,帮看看下面的程序这样设置有没问题?谢谢!
  1. #include<51.h>

  2. #define uint unsigned int

  3. #define uchar unsigned char

  4. bit ti_flag=0,Led_new_flag=0,Pwm_off_on=0,time_10f_flag=0,P_IO_flag=0;time_20f_flag=0,NTC_ON_OFF_flag=0,Roie_flag;
  5. volatile uint time_te_flag=0,count=0;Cont=0,j=0,s=0;
  6. volatile uint T_PCA2,I_samp=0,I_vaue=0,Time_200us_flag=200;
  7. volatile uint TIME_200ms_flag=0,TIME_ACC_flag=0; //LED闪所采集时间标志
  8. volatile uchar num=0,Tim_1ms_flag=0;
  9. volatile double ZKB;

  10. sbit PM_out=P3^6;
  11. /***********定时器0初始化***************/
  12. void Init(void)
  13. {
  14.         AUXR|=0x80; //定时器时钟1T模式

  15. TMOD|=0x00; //设置定时器模式

  16. TL0=0xc4; //设置定时初值5US
  17.         TH0=0xff; //设置定时初值
  18. TF0=0; //清除TF0标志
  19. ET0=1;
  20.         EA=1;
  21.         TR0=1;
  22. /***************定时器0****************/
  23. void timer0(void) interrupt 1
  24. {
  25. Time_200us_flag--;
  26. if(Time_200us_flag==0) //1ms
  27. {
  28. Time_200us_flag=200;
  29. ti_flag=1;
  30. keyScan();  //按键扫描
  31.   j++;
  32.         }
  33. if(Pwm_off_on)
  34. {
  35. num++;
  36. if(num>=2)

  37. num=0;

  38. if(num<ZKB) //产生PWM

  39. PM_out=1;

  40. else
  41. {
  42. PM_out=0;
  43.     }
  44.    }
  45. }
  46. /*************按键扫描及处理***************/
  47. void keyScan()
  48. {

  49. static bit key1_lock=0;
  50. static uchar count1=0;

  51.         if(0==key)
  52.         {

  53. if((count1++>=25)&&(key1_lock==0)&&(PINT==1))//延时滤波25ms
  54.         {
  55.         key1_lock=1;
  56.         Pwm_off_on=~Pwm_off_on;

  57.         if(Pwm_off_on==0)
  58.         PM_out=0;

  59.    }
  60.         }
  61. else
  62. {
  63.         key1_lock=0;//按键自锁标志清0

  64. count1=0; //消抖计数清0
  65. }
  66. if(PINT==0)
  67. {
  68.         Power=0;

  69.         }
  70.         }
  71. /***************主程序****************/
  72. void main(void)
  73. {

  74. Init();
  75. while(1);
  76. }
复制代码


回复

使用道具 举报

ID:275826 发表于 2020-4-13 15:54 | 显示全部楼层
一直在中断,检测不到按键操作
回复

使用道具 举报

ID:322939 发表于 2020-4-13 16:41 | 显示全部楼层
tyrl800 发表于 2020-4-13 15:54
一直在中断,检测不到按键操作

除了降低频率(时间设大),有没其它办法?
回复

使用道具 举报

ID:322939 发表于 2020-4-13 16:43 | 显示全部楼层
tyrl800 发表于 2020-4-13 15:54
一直在中断,检测不到按键操作

因为如果把频率调到低于30KHZ,在控温时输出到发热芯那里会吱吱响
回复

使用道具 举报

ID:213173 发表于 2020-4-13 16:54 | 显示全部楼层
中断周期5us,所有的程序都在中断中运行,时间够用吗?
回复

使用道具 举报

ID:322939 发表于 2020-4-13 16:58 | 显示全部楼层
wulin 发表于 2020-4-13 16:54
中断周期5us,所有的程序都在中断中运行,时间够用吗?

那么如何提高PWM频率又不影响其它程序运行?
回复

使用道具 举报

ID:322939 发表于 2020-4-13 17:06 | 显示全部楼层
wulin 发表于 2020-4-13 16:54
中断周期5us,所有的程序都在中断中运行,时间够用吗?

原来定时器的时间设100US中断没问题,但是在PID控温时负载会吱吱响,必须要把频率提高才能解决。
回复

使用道具 举报

ID:213173 发表于 2020-4-13 17:53 | 显示全部楼层
LAW1100 发表于 2020-4-13 17:06
原来定时器的时间设100US中断没问题,但是在PID控温时负载会吱吱响,必须要把频率提高才能解决。

1.优化程序,很简单的PWM程序写的有点啰嗦。
2.提高MCU时钟频率,加快运行速度。
3.中断只留必须的任务,其它非即时响应的任务放在主函数运行。比如按键扫描。
4.中断周期按预估中断任务所需时间不小于200%,留足够时间给主程序使用。
回复

使用道具 举报

ID:322939 发表于 2020-4-14 08:31 | 显示全部楼层
wulin 发表于 2020-4-13 17:53
1.优化程序,很简单的PWM程序写的有点啰嗦。
2.提高MCU时钟频率,加快运行速度。
3.中断只留必须的任务 ...

多谢,如果不用中断使用时钟分频是否可行?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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