happy2058 发表于 2022-2-28 22:08 2KHZ的%10就是50uS,那就是说最坏的情况就是两次中断的间隔是50uS,整体就是每500uS进入定时器中断两次,如果定时器中断做的事情太多了,主函数就会慢下来了 进入定时器中断尽可能的不要处理太多东西,但凡是能在主函数处理的,就不要在中断中处理 定时器优先等级设定为最高,这样就保证PWM占空比的稳定 串口的波特率要尽量的设定低一点,这样就不会丢数据 个人感觉,如果量不大的话,就换成STC8G1K08的,这个有片上PWM,能省事很多,价格也就高了那么一两毛的而已 |
Y_G_G 发表于 2022-2-28 20:43 A板就输出两路PWM 2K的 占空比10%可调,用一个定时器,尽量不要过多的操作,后期方便移值,因为后期一个定时器要干几个功能。 |
happy2058 发表于 2022-2-28 20:21 如果不是商业机密,就把完整的代码上传 如果是不方便,你至少是要说明,现在要做什么,一共要做几个任务,或者是要给个电路图看一下是怎么一回事 不然的话,大多的网友其实是不知道你要做什么的 |
Y_G_G 发表于 2022-2-28 19:09 谢谢这位大哥,这个你之前已经教过我了,再次感谢。现在是一个定时器处理多个任务。 |
1,你要设定要好各个中断的优先等级,100uS的定时器中断时间是很短的,你要根据你自己的实际要求来设定好优先等级,默认的等级都是一样的,但查询是有先后顺序的,当定时器进入中断之后,串口中断就被阻断了 2,更改PWM占空比在主函数更改,定时器只作一个加载的,调节会慢一点,但不会有太大影响的,给个代码参考一下 void timer1_pwm()interrupt 3 //利用t1定时器产生PWM波形 { TF1 = 0; //清除TF1标志 if(HI) { TH1=pwm_l_H; //低电平时间 TL1=pwm_l_L; // HI=0; PWM=0; } else { TH1=pwm_h_H; //高电平时间 TL1=pwm_h_L; // HI=1; PWM=1; } TR1 = 1; //定时器1开始计时 } 在主函数调节pwm_l_H和pwm_l_L这两个全局变量就可以了 |
为什么不是发送控制参数,让从机按参数要求产生PWM? |
yzwzfyz 发表于 2022-2-28 14:32 是啊,我试了好久,发现不能这写设到T0最高级 TO做100us标志位反转,时间基准 事件A 在while(1)判断标志位,自加,反转输出,反转标志位,为下一次TO中断判断。 输出不一至的原因,可能是事件A 在while(1)顺序,他不是中断后马上判断,造成延迟了。 |
提示: 1、PWM的基础时钟取自何处?(假设来自于事件A。) 2、A事件在其它中断发生时,会不会受到影响?(其它中断更高级,会打断A!) |