微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机pwm波的频率是怎么算的?

51单片机pwm波的频率是怎么算的?

时间:10-02 整理:3721RD 点击:
这个程序的频率是多少?是不是看根据定时的时间计算的?要改成10k频率怎么改?谢谢!

  1. <div class="blockcode"><blockquote>
  2.   bit Right_moto_stop=1;
  3. bit Left_moto_stop =1;
  4. unsigned char pwm_val_left =0;//变量定义
  5. unsigned char push_val_left =0;// 左电机占空比N/20
  6. unsigned char pwm_val_right =0;
  7. unsigned char push_val_right=0;// 右电机占空比N/20
  8. unsigned int timer=0;

  9. /************************************************************************/
  10. /* PWM调制电机转速 */
  11. /************************************************************************/
  12. /* 左电机调速 */
  13. /*调节push_val_left的值改变电机转速,占空比 */
  14. void pwm_out_left_moto(void)
  15. {
  16. if(Left_moto_stop)
  17. {
  18. if(pwm_val_left<=push_val_left)
  19. {
  20. Left_moto_pwm=1;
  21. }
  22. else
  23. {
  24. Left_moto_pwm=0;
  25. }
  26. if(pwm_val_left>=20)
  27. pwm_val_left=0;
  28. }
  29. else
  30. {
  31. Left_moto_pwm=0;
  32. }
  33. }
  34. /******************************************************************/
  35. /* 右电机调速 */
  36. void pwm_out_right_moto(void)
  37. {
  38. if(Right_moto_stop)
  39. {
  40. if(pwm_val_right<=push_val_right)
  41. {
  42. Right_moto_pwm=1;
  43. }
  44. else
  45. {
  46. Right_moto_pwm=0;
  47. }
  48. if(pwm_val_right>=20)
  49. pwm_val_right=0;
  50. }
  51. else
  52. {
  53. Right_moto_pwm=0;
  54. }
  55. }



  56. /***************************************************/
  57. ///*TIMER1中断服务子函数产生PWM信号*/
  58. void timer1()interrupt 3
  59. {
  60. TH1=(65536-1000)/256; //1ms定时
  61. TL1=(65536-1000)%256;
  62. timer++;
  63. pwm_val_left++;
  64. pwm_val_right++;
  65. pwm_out_left_moto();
  66. pwm_out_right_moto();
  67. }

复制代码



刚忘了贴程序,补上去了

是不是定时1us,高电平计数满100转低电平就是10KHz啦?

不好意思,我不会你问的问题。
但我想问一下,你会单片机PID温度控制类似的程序吗?也是用PID控制后产生PWM波控制的

原来做课设的时候,在网上找的程序,我也不太会用,你看看

  1. /*********************************
  2. 定时器初始化
  3. *********************************/
  4. void time_init()
  5. { TMOD = 0x01;
  6.     TH0 = 0x0D8;
  7.     TL0 = 0x0F0;
  8. EA=1;
  9. ET0=1;;
  10. TR0=1;

  11. }


  12. /*************************
  13. pwm波输出的定时中断
  14. **************************/
  15. void timer0()interrupt 1
  16. {


  17. count++;
  18. if(count<=(hightime))
  19.         pwm=0;
  20. else if(count<=100)
  21. {pwm=1;
  22. }
  23. else
  24. count=0;
  25. TH0 = 0x0D8;
  26. TL0 = 0x0F0;
  27. }

  28. /*********************
  29. pid算法系数装载
  30. ***********************/
  31. void pid_init()
  32. { uk=0;
  33. hightime=0;//输出占空比
  34. e1=0;//本次的温度差
  35. e2=0;//上次的温度差
  36. e3=0;//上上次的温度差
  37. kp=10;
  38. ki=5;
  39. kd=5;
  40. }
  41. /************************
  42. 温度比较pid算法
  43. ************************/
  44. void pid_ys()
  45. {
  46. if(rltemp<settemp)//如果实际温度小于设定温度
  47. {if((settemp-rltemp)>10)//如果差20度以上,全速加热
  48.   {hightime=100;}
  49. else
  50.         {e1=settemp-rltemp;
  51.         duk=(kp*(e1-e2)+ki*e1+kd*(e1-e2*2+e3))
  52.         uk=uk+duk;
  53.         if(uk>100)
  54. uk=100;
  55. else if(uk<-100)
  56. uk=-100;
  57. if(uk<0)
  58. {hightime=-uk;}

  59. else{ hightime=uk;
  60. }
  61. e3=e2;
  62. e2=e1;        }
  63. }

  64. if(rltemp>=settemp)  //如果大于设定温度值
  65. {if(rltemp-settemp>0)
  66.                 {hightime=0;//停止加热
  67. }
  68. else
  69. {e1=rltemp-settemp;          //温度相等时控温
  70. duk=(kp*(e1-e2)+ki*e1+kd*(e1-e2*2+e3));
  71. uk=uk+duk;
  72. if(uk>100)
  73. uk=100;
  74. else if(uk<-100)
  75. uk=-100;
  76. if(uk<0)
  77. {hightime=-uk;}

  78. else{ hightime=uk;
  79. }
  80. e3=e2;
  81. e2=e1;
  82. }
  83. }
  84. }

复制代码

你度一下就能找到完整的程序

这个比我找的都能看懂点,你做过类似的PID温度控制吗,PID参数整定之类的你怎么做的呢?然后是请问你有硬件电路图与相关程序吗?容易看懂一点。或者这个程序的完整程序?因为这里的测量温度不知道它的时间间隔应该是多少之类的问题

程序不完整,count的定义不知道什么意思,百度没百度到

程序私聊给你了 ,能不能看懂看你的造化了。我做可控硅热水温度控制课设的时候东拼西凑的程序。

造化弄人谢谢了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top