请高手给个利用STC89C52定时器产生PWM信号的C语言源程序,主要是用来控制小车的。谢谢了!
用不用定时器都行,用延时也行,大家有什么就给写点什么吧!肯定会涨分!!
PWM信号的频率最好取多少?
这个是要看你的受控器件
下面给个思路,之前我说也的
1.先确定你的受控芯片能响应的频率
2.确定控制占空比的百分比精度(是1/10还是1/100)
3.让定时器定时在最小的精度上
4.在定时器中断响应中,计数反转IO信号。得到相应占空比的PWM信号
5.只要修正计数次数还有相应的边界,就能得到想要的PWM信号灯
是小车哦,用L298驱动。有一个例子是这么说的:用L298驱动两台直流减速电机的电路。引脚6,9可用于PWM控制。如果机器人项目只要求直行前进,则可将5,10和7,12两对引脚分别接高电平和低电平,仅用单片机的两个端口给出PWM信号控制6,11即可实现直行、转弯、加减速等动作。6,11怎么控制能给解释下么?
定时中断是常用的,这样也可以减少CPU的占用率
希望不要少软件延时!
1K~10kH或者22KHz(需滤波)以上,避免产生音频干扰
转速用占空比控制
楼主的是开环操作啊!
以下的程序可以参考一下
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;
}