51单片机pwm波的频率是怎么算的?
时间:10-02
整理:3721RD
点击:
这个程序的频率是多少?是不是看根据定时的时间计算的?要改成10k频率怎么改?谢谢!
- <div class="blockcode"><blockquote>
- bit Right_moto_stop=1;
- bit Left_moto_stop =1;
- unsigned char pwm_val_left =0;//变量定义
- unsigned char push_val_left =0;// 左电机占空比N/20
- unsigned char pwm_val_right =0;
- unsigned char push_val_right=0;// 右电机占空比N/20
- unsigned int timer=0;
- /************************************************************************/
- /* PWM调制电机转速 */
- /************************************************************************/
- /* 左电机调速 */
- /*调节push_val_left的值改变电机转速,占空比 */
- void pwm_out_left_moto(void)
- {
- if(Left_moto_stop)
- {
- if(pwm_val_left<=push_val_left)
- {
- Left_moto_pwm=1;
- }
- else
- {
- Left_moto_pwm=0;
- }
- if(pwm_val_left>=20)
- pwm_val_left=0;
- }
- else
- {
- Left_moto_pwm=0;
- }
- }
- /******************************************************************/
- /* 右电机调速 */
- void pwm_out_right_moto(void)
- {
- if(Right_moto_stop)
- {
- if(pwm_val_right<=push_val_right)
- {
- Right_moto_pwm=1;
- }
- else
- {
- Right_moto_pwm=0;
- }
- if(pwm_val_right>=20)
- pwm_val_right=0;
- }
- else
- {
- Right_moto_pwm=0;
- }
- }
- /***************************************************/
- ///*TIMER1中断服务子函数产生PWM信号*/
- void timer1()interrupt 3
- {
- TH1=(65536-1000)/256; //1ms定时
- TL1=(65536-1000)%256;
- timer++;
- pwm_val_left++;
- pwm_val_right++;
- pwm_out_left_moto();
- pwm_out_right_moto();
- }
刚忘了贴程序,补上去了
是不是定时1us,高电平计数满100转低电平就是10KHz啦?
不好意思,我不会你问的问题。
但我想问一下,你会单片机PID温度控制类似的程序吗?也是用PID控制后产生PWM波控制的
原来做课设的时候,在网上找的程序,我也不太会用,你看看
- /*********************************
- 定时器初始化
- *********************************/
- void time_init()
- { TMOD = 0x01;
- TH0 = 0x0D8;
- TL0 = 0x0F0;
- EA=1;
- ET0=1;;
- TR0=1;
- }
- /*************************
- pwm波输出的定时中断
- **************************/
- void timer0()interrupt 1
- {
- count++;
- if(count<=(hightime))
- pwm=0;
- else if(count<=100)
- {pwm=1;
- }
- else
- count=0;
- TH0 = 0x0D8;
- TL0 = 0x0F0;
- }
- /*********************
- pid算法系数装载
- ***********************/
- void pid_init()
- { uk=0;
- hightime=0;//输出占空比
- e1=0;//本次的温度差
- e2=0;//上次的温度差
- e3=0;//上上次的温度差
- kp=10;
- ki=5;
- kd=5;
- }
- /************************
- 温度比较pid算法
- ************************/
- void pid_ys()
- {
- if(rltemp<settemp)//如果实际温度小于设定温度
- {if((settemp-rltemp)>10)//如果差20度以上,全速加热
- {hightime=100;}
- else
- {e1=settemp-rltemp;
- duk=(kp*(e1-e2)+ki*e1+kd*(e1-e2*2+e3))
- uk=uk+duk;
- if(uk>100)
- uk=100;
- else if(uk<-100)
- uk=-100;
- if(uk<0)
- {hightime=-uk;}
- else{ hightime=uk;
- }
- e3=e2;
- e2=e1; }
- }
- if(rltemp>=settemp) //如果大于设定温度值
- {if(rltemp-settemp>0)
- {hightime=0;//停止加热
- }
- else
- {e1=rltemp-settemp; //温度相等时控温
- duk=(kp*(e1-e2)+ki*e1+kd*(e1-e2*2+e3));
- uk=uk+duk;
- if(uk>100)
- uk=100;
- else if(uk<-100)
- uk=-100;
- if(uk<0)
- {hightime=-uk;}
- else{ hightime=uk;
- }
- e3=e2;
- e2=e1;
- }
- }
- }
你度一下就能找到完整的程序
这个比我找的都能看懂点,你做过类似的PID温度控制吗,PID参数整定之类的你怎么做的呢?然后是请问你有硬件电路图与相关程序吗?容易看懂一点。或者这个程序的完整程序?因为这里的测量温度不知道它的时间间隔应该是多少之类的问题
程序不完整,count的定义不知道什么意思,百度没百度到
程序私聊给你了 ,能不能看懂看你的造化了。我做可控硅热水温度控制课设的时候东拼西凑的程序。
造化弄人谢谢了