
给你个用C语言编的,可读性强,可移植性高。
/ =======直流电机的PWM速度控制程序======== /
/ 晶振采用110592M,产生的PWM的频率约为91Hz /
#include<reg51h>
#include<mathh>
#define uchar unsigned char
#define uint unsigned int
sbit en1=P1^0; / L298的Enable A /
sbit s1=P1^2; / L298的Input 1 /
sbit s2=P1^3; / L298的Input 2 /
uchar t=0; / 中断计数器 /
uchar m1=0; / 电机1速度值 /
uchar tmp1,tmp2; / 电机当前速度值 /
/ 电机控制函数 index-电机号(1,2); speed-电机速度(-100—100) /
void motor(uchar index, char speed)
{
if(speed>=-100 && speed<=100)
{
if(index==1) / 电机1的处理 /
{
m1=abs(speed); / 取速度的绝对值 /
if(speed<0) / 速度值为负则反转 /
{
s1=0;
s2=1;
}
else / 不为负数则正转 /
{
s1=1;
s2=0;
}
}
}
}
void delay(uint j) / 简易延时函数 /
{
for(j;j>0;j--);
}
void main()
{
uchar i;
TMOD=0x02; / 设定T0的工作模式为2 /
TH0=0x9B; / 装入定时器的初值 / 定时101us
TL0=0x9B;
EA=1; / 开中断 /
ET0=1; / 定时器0允许中断 /
TR0=1; / 启动定时器0 /
while(1) / 电机实际控制演示 /
{
for(i=0;i<=100;i++) / 正转加速 /
{
motor(1,i);
delay(5000);
}
for(i=100;i>0;i--) / 正转减速 /
{
motor(1,i);
delay(5000);
}
for(i=0;i<=100;i++) / 反转加速 /
{
motor(1,-i);
delay(5000);
}
for(i=100;i>0;i--) / 反转减速 /
{
motor(1,-i);
delay(5000);
}
}
}
void timer0() interrupt 1 / T0中断服务程序 /
{
if(t==0) / 1个PWM周期完成后才会接受新数值 /
{
tmp1=m1;
tmp2=m2;
}
if(t<tmp1) en1=1; else en1=0; / 产生电机1的PWM信号 /
t++;
if(t>=100) t=0; / 1个PWM信号由100次中断产生 /
}
你好哦,给你个程序,这个也不算是正规的PWM了,简单的延时实现PWM波而已,按键可以调整转速(我没去抖,你自己加上呵)
#include<reg51h>
/定义按键和L298N引脚/
sbit BZ1=P0^0; sbit IN1=P2^0;
sbit BZ2=P0^1; sbit IN2=P2^1;
sbit BF1=P0^2; sbit IN3=P2^2;
sbit BF2=P0^3; sbit IN4=P2^3;
sbit BJIA1=P0^4;
sbit BJIA2=P0^5;
sbit BJIAN1=P0^6;
sbit BJIAN2=P0^7;
/函数声明/
void delay(t);
void Z1();
void Z2();
void F1();
void F2();
void JIA1();
void JIA2();
void JIAN1();
void JIAN2();
void change();
char W=0;//W用来在调速状态下选择电机;
int t1=80,t2=80;
/延时函数/
void delay(int t)
{while(t--);}
/正转函数1/
void Z1()
{IN1=1;IN2=0;W=1;}
/正转函数2/
void Z2()
{IN3=1;IN4=0;W=1;}
/反转函数1/
void F1()
{IN1=0;IN2=1;W=2;}
/反转函数2/
void F2()
{IN3=0;IN4=1;W=2;}
/加速函数1/
void JIA1()
{t1+=10;}
/加速函数2/
void JIA2()
{t2+=10;}
/减速函数1/
void JIAN1()
{t1-=10;}
/减速函数2/
void JIAN2()
{t2-=10;}
/停止/
void TING()
{IN1=IN2=IN3=IN4=0;}
/制动函数/
void ZHI()
{IN1=IN2=IN3=IN4=1;}
/按键信号/
void change()
{
if(BZ1==0){Z1();delay(t1);TING();delay(255-t1);}
if(BZ2==0){Z2();delay(t2);TING();delay(255-t2);}
if(BF1==0){F1();delay(t1);TING();delay(255-t1);}
if(BF2==0){F2();delay(t2);TING();delay(255-t2);}
if(BJIA1==0&&t1<235){delay(5);JIA1();}
if(BJIA2==0&&t2<235){delay(5);JIA2();}
if(BJIAN1==0&&t1>80){delay(5);JIAN1();}
if(BJIAN2==0&&t2>80){delay(5);JIAN2();}
if(BZ1==0&&(BZ2!=0&&BF1!=0&&BF2!=0)){delay(255);}
if(BZ2==0&&(BZ1!=0&&BF1!=0&&BF2!=0)){delay(255);}
if(BF1==0&&(BZ1!=0&&BZ2!=0&&BF2!=0)){delay(255);}
if(BF2==0&&(BZ1!=0&&BZ2!=0&&BF1!=0)){delay(255);}
}
/主程序/
void main()
{
P0=0xff;
while(1)
{change();}
}
我这里的网传不上去,要的话,把你邮箱给我我发给你
程序我看了。
你是打算在电脑上发数据,然后控制单片机的PWM,至少PWM部分的程序只能这样理解。
但是你程序里是单片机发送数据,而不是接收数据啊!
还有,我感觉你的定时器中断处理不对——当然,我很久没用51了,不确定。
再好好的描述一下你的要求。还有,程序是你写的吗?
以上就是关于谁能给解释一下这个pwm程序 怎么输出波形 和调速的给加100分全部的内容,包括:谁能给解释一下这个pwm程序 怎么输出波形 和调速的给加100分、pwm脉冲调制直流电机需注意什么,求一 程序,用C的,谢谢、使用串口传递数据控制PWM对直流电机调速.请各位大侠看看我的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)