如何使MCS-51单片机产生PWM信号来控制直流电机的转速
本人现在在做毕业设计,就差程序部分没出来了,以前没学过单片机,不知道所谓的定时器是什么东西。学了几天没有头绪。现在很着急。现在请求高手能帮我编个程序,用C语言,基于msc...
本人现在在做毕业设计,就差程序部分没出来了,以前没学过单片机,不知道所谓的定时器是什么东西。学了几天没有头绪。现在很着急。
现在请求高手能帮我编个程序,用C语言,基于msc-51单片机,使它以软件的方式直接产生占空比分别为30%,60%。90%的脉冲波,通过L298驱动电路放大来控制直流电机的转速,还有就是我不知道我的单片机选多大的晶振。
另外,我到现在还搞不懂,单片机输出pwm从哪几个管脚输送给L298。单片机和驱动电路l298之间的线路连接方式,不知道从哪儿输出从哪儿输入。哪位高手能给我个详细的电路图,方便我明白理解,
十分感谢高手能够相助,另外由于我的财富值下载文库用完了,没有分值了,十分抱歉大家了。
就要毕设答辩了,现在很着急,恳请哪位大侠帮忙一下。~~~~在下感激不尽~~~
我再把情况补充一下,单片机要控制的是一个电机的转速,分为三个功能:加速、减速、停止。用C语言编程,KEIL软件编译。 展开
现在请求高手能帮我编个程序,用C语言,基于msc-51单片机,使它以软件的方式直接产生占空比分别为30%,60%。90%的脉冲波,通过L298驱动电路放大来控制直流电机的转速,还有就是我不知道我的单片机选多大的晶振。
另外,我到现在还搞不懂,单片机输出pwm从哪几个管脚输送给L298。单片机和驱动电路l298之间的线路连接方式,不知道从哪儿输出从哪儿输入。哪位高手能给我个详细的电路图,方便我明白理解,
十分感谢高手能够相助,另外由于我的财富值下载文库用完了,没有分值了,十分抱歉大家了。
就要毕设答辩了,现在很着急,恳请哪位大侠帮忙一下。~~~~在下感激不尽~~~
我再把情况补充一下,单片机要控制的是一个电机的转速,分为三个功能:加速、减速、停止。用C语言编程,KEIL软件编译。 展开
3个回答
展开全部
我试了几次都传不上图去,我把管脚定义说一下吧。
P1.0—P1.4接5个对地键,分别作为:顺时针、逆时针、停止、加速和减速按键。
P3.0接L294的IN1,P3.1接IN2。P3.7接ENA,也就是PWM输出口。
另外你也可以用P0和P2口接LED或者LCD显示屏。
晶振就用单片机流行的12MHz就行了。
我这是用C语言写程序Keil编译。
#include<reg51.h>
sbit MA = P3^0;
sbit MB = P3^1;
sbit PWM = P3^7;
bit KeyFree;
unsigned char PWM_OUT;
void Delay(unsigned char); //声明延时函数
unsigned char KeyScan(void);
void keyProcess(unsigned char);
main()
{
TMOD = 0x01;
TH0 = - 50000 /256;
TL0 = - 50000 % 256;
IE = 0x82;
TR0 = 1;
while (1)
{
keyProcess(KeyScan());
}
}
void T0_INT () interrupt 1 //定时器函数控制PWM输出
{
TH0 = -5000 / 256;
TL0 = -5000 % 256;
PWM=1; //设置PWM输出
Delay(PWM_OUT);
PWM=0;
Delay(100-PWM_OUT);
}
void Delay(unsigned char x)
{
uchar i;
while(x--) for(i = 0;i < 200; i++);
}
unsigned char KeyScan(void)
{
P1|=0x1f;
if((P1&0x1f)!=0x1f)
{
Delay(10); //延时去抖
if((P1&0x1f)!=0x1f)
{
return P1&0x1f;
}
}
return P1&0x1f;
}
void keyProcess(uint key)
{
if(key==0x1f) /*******************/
{ /* */
KeyFree=1; /* 软件松手检测 */
} /* */
else /* */
{ /* */
if(KeyFree==1) /* */
{ /*******************/
KeyFree=0;
/*******************************************/
switch (key)
{
case 0x1e : {
MA=1;
MB=0;
break;}
case 0x1d : {
MA=0;
MB=1;
break;}
case 0x1b : {
PWM_OUT =0;
break;}
case 0x17 : {
if(PWM_OUT!=90){
PWM_OUT+=30;}
break;}
case 0x0f : {
if(PWM_OUT!=30&&PWM_OUT!=0){
PWM_OUT-=30;}
break;}
}
/*******************************************/
}
}
}
P1.0—P1.4接5个对地键,分别作为:顺时针、逆时针、停止、加速和减速按键。
P3.0接L294的IN1,P3.1接IN2。P3.7接ENA,也就是PWM输出口。
另外你也可以用P0和P2口接LED或者LCD显示屏。
晶振就用单片机流行的12MHz就行了。
我这是用C语言写程序Keil编译。
#include<reg51.h>
sbit MA = P3^0;
sbit MB = P3^1;
sbit PWM = P3^7;
bit KeyFree;
unsigned char PWM_OUT;
void Delay(unsigned char); //声明延时函数
unsigned char KeyScan(void);
void keyProcess(unsigned char);
main()
{
TMOD = 0x01;
TH0 = - 50000 /256;
TL0 = - 50000 % 256;
IE = 0x82;
TR0 = 1;
while (1)
{
keyProcess(KeyScan());
}
}
void T0_INT () interrupt 1 //定时器函数控制PWM输出
{
TH0 = -5000 / 256;
TL0 = -5000 % 256;
PWM=1; //设置PWM输出
Delay(PWM_OUT);
PWM=0;
Delay(100-PWM_OUT);
}
void Delay(unsigned char x)
{
uchar i;
while(x--) for(i = 0;i < 200; i++);
}
unsigned char KeyScan(void)
{
P1|=0x1f;
if((P1&0x1f)!=0x1f)
{
Delay(10); //延时去抖
if((P1&0x1f)!=0x1f)
{
return P1&0x1f;
}
}
return P1&0x1f;
}
void keyProcess(uint key)
{
if(key==0x1f) /*******************/
{ /* */
KeyFree=1; /* 软件松手检测 */
} /* */
else /* */
{ /* */
if(KeyFree==1) /* */
{ /*******************/
KeyFree=0;
/*******************************************/
switch (key)
{
case 0x1e : {
MA=1;
MB=0;
break;}
case 0x1d : {
MA=0;
MB=1;
break;}
case 0x1b : {
PWM_OUT =0;
break;}
case 0x17 : {
if(PWM_OUT!=90){
PWM_OUT+=30;}
break;}
case 0x0f : {
if(PWM_OUT!=30&&PWM_OUT!=0){
PWM_OUT-=30;}
break;}
}
/*******************************************/
}
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询