PWM信号的产生

faiou   2009-5-16 00:21 楼主
请高手给个利用STC89C52定时器产生PWM信号的C语言源程序,主要是用来控制小车的。谢谢了!

回复评论 (12)

主要想明白小车左右转时信号怎么控制!
点赞  2009-5-16 00:28
用不用定时器都行,用延时也行,大家有什么就给写点什么吧!肯定会涨分!!
点赞  2009-5-16 00:41
再补充一下,PWM信号的频率最好取多少?
点赞  2009-5-16 03:34
PWM信号的频率最好取多少?

这个是要看你的受控器件

下面给个思路,之前我说也的

1.先确定你的受控芯片能响应的频率
2.确定控制占空比的百分比精度(是1/10还是1/100)
3.让定时器定时在最小的精度上
4.在定时器中断响应中,计数反转IO信号。得到相应占空比的PWM信号
5.只要修正计数次数还有相应的边界,就能得到想要的PWM信号灯
点赞  2009-5-16 13:40
是小车哦,用L298驱动。有一个例子是这么说的:用L298驱动两台直流减速电机的电路。引脚6,9可用于PWM控制。如果机器人项目只要求直行前进,则可将5,10和7,12两对引脚分别接高电平和低电平,仅用单片机的两个端口给出PWM信号控制6,11即可实现直行、转弯、加减速等动作。6,11怎么控制能给解释下么?
点赞  2009-5-16 21:25
用定时   固定频率  调占空比
点赞  2009-5-18 05:55
用定时器,然后不用同的频率就给定时器赋不同的值
点赞  2009-5-18 09:37
定时中断是常用的,这样也可以减少CPU的占用率
希望不要少软件延时!
点赞  2009-5-18 09:38
帮顶,楼主贴个代码参考参考可以么...
点赞  2009-5-19 00:38
关注
点赞  2009-5-28 22:14
1K~10kH或者22KHz(需滤波)以上,避免产生音频干扰
转速用占空比控制
点赞  2009-5-29 00:28
楼主的是开环操作啊!
以下的程序可以参考一下
89C52 PWM输出程序
#include //Keil header file name
#include "use.h"
#include "Ver.h"
//extern void LedOut(unsigned char *pLed);
#define Pmax 55000 //55000 //42666(18.4320)
#define Ki 2.2       //i=2
//----------------------------
sbit PwinPin=P3^5;
//----------------------------
typedef union
{
    unsigned int Pwm;     //pwm的数据
    unsigned char PwmUse[2]; //[0]=H;[1]=L
}PWM;
//----------------------------
PWM       PwmData;
unsigned int PwmBak;
//----------------------------
unsigned char PwmF=0;     //输出的1,0的标志
/*****************************************
PWM计算,输出
t0=T50ms(b0/[fs-fo]+Sgn(U)*20%+a1
;T50ms=Pwm50+Ah
;B00V;Must Bo In(Fo-Fs)
*******************************************/
void PwmOut(void)
{
   float Pwm,i,k,j;
   k=Pmax+(Mp1.AH+OminH)*Ki;
   i=(PminL+Mp1.AL)*Ki;
//----------------------------
//LedOut(LedBuf);        //LED显示输出
//----------------------------
   j=(LedMenu.B-Mp1.Fo)/(Mp1.Fs-Mp1.Fo);
   if(j<0) j=0;
   if(j>1) j=1;
   Pwm=j*k; //Bo/(Fs-Fo)*Pk
   j=Pwm*0.8+k*0.2+i; //先计算
   if(Mp1.U==1) {Pwm=j;}
   else Pwm=Pwm+i;
   TR0=0;
   PwmBak=(unsigned int)Pwm; //更新数据
   TR0=1;
}
//-------------------------------
void Init_Pwm(void)
{
   PwmData.Pwm=0;
   PwmPin=0;          //输出0 (低电平)
// PwmOut();
}
//定时器0 中断处理 pwmout()
void T0_Do(void) interrupt 1{
   TR0=0;
   if(PwmF==0)  //输出高电平
   {
      PwmData.Pwm=-PwmBak;
      TH0=PwmData.PwmUse[0];
      TL0=PwmData.PwmUse[1];
      PwmPin=1;         //0 输出
      PwmF=1;
    }else{
      PwmData.Pwm=-PwmData.Pwm;
      TH0=PwmData.PwmUse[0];
      TL0=PwmData.PwmUse[1];   
      PwmPin=0;         //1 输出
      PwmF=0;
    }
    TR0=1;
}

点赞  2009-5-29 19:13
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复