4206|12

61

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

PWM信号的产生 [复制链接]

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

最新回复

楼主的是开环操作啊! 以下的程序可以参考一下 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(j1) 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
点赞 关注

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
主要想明白小车左右转时信号怎么控制!
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
用不用定时器都行,用延时也行,大家有什么就给写点什么吧!肯定会涨分!!
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

4
 
再补充一下,PWM信号的频率最好取多少?
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
PWM信号的频率最好取多少?

这个是要看你的受控器件

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

1.先确定你的受控芯片能响应的频率
2.确定控制占空比的百分比精度(是1/10还是1/100)
3.让定时器定时在最小的精度上
4.在定时器中断响应中,计数反转IO信号。得到相应占空比的PWM信号
5.只要修正计数次数还有相应的边界,就能得到想要的PWM信号灯
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

6
 
是小车哦,用L298驱动。有一个例子是这么说的:用L298驱动两台直流减速电机的电路。引脚6,9可用于PWM控制。如果机器人项目只要求直行前进,则可将5,10和7,12两对引脚分别接高电平和低电平,仅用单片机的两个端口给出PWM信号控制6,11即可实现直行、转弯、加减速等动作。6,11怎么控制能给解释下么?
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

7
 
用定时   固定频率  调占空比
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

8
 
用定时器,然后不用同的频率就给定时器赋不同的值
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

9
 
定时中断是常用的,这样也可以减少CPU的占用率
希望不要少软件延时!
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

10
 
帮顶,楼主贴个代码参考参考可以么...
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

11
 
关注
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

12
 
1K~10kH或者22KHz(需滤波)以上,避免产生音频干扰
转速用占空比控制
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

13
 
楼主的是开环操作啊!
以下的程序可以参考一下
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;
}

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表