OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4486|回复: 4

51单片机直流电机调速问题!!

[复制链接]

10

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2015-11-11
在线时间
29 小时
发表于 2015-11-24 21:58:11 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]/*程序功能:P1.0输出PWM信号,按S19键直流电机加速 ?按S20键直流电机减速旋转*/ #include "reg52.h" sbit P1_0=P1^0; sbit P1_1=P3^6; sbit P1_2=P3^7; unsigned char PWMH; //高电平脉冲的个数 unsigned char PWM; //PWM周期(脉冲宽度调制) unsigned char COUNTER; void K1CHECK(); void K2CHECK(); void INTTO() interrupt 1 { COUNTER++; //计数值加1 if(/*(COUNTER!=PWMH)&&*/(COUNTER==PWM)) //如果等于高电平脉冲数 { COUNTER=1; //计数器复位 P1_0=1; //P1.0为高电平 } else if(COUNTER==PWMH) P1_0=0; //P1.0变为低电平 } main() { PWMH=0x02;//2个 COUNTER=0x01; PWM=0x15;//21 TMOD=0x02; //定时器0在模式2下工作(8位初值自动重装的8位定时/计数器) TL0=0x38; //定时器每200us产生一次溢出 TH0=0x38; //自动重装的值 ET0=1; //使能定时器0中断 EA=1; //使能总中断 TR0=1; //开始计时 while(1) { if(P1_1==0) K1CHECK();//扫描KEY1, if(P1_2==0) K2CHECK();//扫描KEY2,如果按下KEY2,跳转到KEY2处理程序 } } void K1CHECK()//加速程序 { while(P1_1==0);//松手检查 if(PWMH!=PWM)//0x15=21 { PWMH++; if(PWMH==PWM) { TR0=0; P1_0=1; } /*else { if(PWMH==0x02) { TR0=1; } }*/ } } void K2CHECK()//减速程序 { unsigned char TEMP; while(P1_2==0); if(PWMH!=0x01) { PWMH--; TEMP=PWM; TEMP--; if(PWMH==0x01) { TR0=0; P1_0=0; } /*else { if(PWMH==TEMP) { TR0=1; } }*/ } } [/mw_shl_code]
[mw_shl_code=c,true][/mw_shl_code] [mw_shl_code=c,true]请问?为什么把下面这段删掉,电机速度减到0之后,按加速键加速不了?[/mw_shl_code] [mw_shl_code=c,true]/*else { if(PWMH==TEMP) { TR0=1; } }*/ [mw_shl_code=c,true] [/mw_shl_code] [/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

LZ啊,你没发现你删的两段代码里都有一句TR0=1;么??这是打开定时器计时的。你的程序设定当PWMH=PWM时或等于0x01时,定时器停止计时(TR0=0;),P01恒定输出1或0(加速和减速程序里的"P1_0=1"和"P1_0=0"),PWM停止工作;所以你需要在这两段程序里重新打开定时器计时以生产PWM波; 具体说: 当PWMH==PWM时,你按下减速键,减速程序检测到PWMH==TEMP,则执行TR0=1,重新打开计时; 当PWMH==0X01是,你按下加速键,加速程序检测到P ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

98

帖子

0

精华

高级会员

Rank: 4

积分
618
金钱
618
注册时间
2015-11-20
在线时间
89 小时
发表于 2015-11-24 21:58:12 | 显示全部楼层
LZ啊,你没发现你删的两段代码里都有一句TR0=1;么??这是打开定时器计时的。你的程序设定当PWMH=PWM时或等于0x01时,定时器停止计时(TR0=0;),P01恒定输出1或0(加速和减速程序里的"P1_0=1"和"P1_0=0"),PWM停止工作;所以你需要在这两段程序里重新打开定时器计时以生产PWM波;
具体说:
当PWMH==PWM时,你按下减速键,减速程序检测到PWMH==TEMP,则执行TR0=1,重新打开计时;
当PWMH==0X01是,你按下加速键,加速程序检测到PWMH==0X02,则执行TR0=1,重新打开计时;
懂了没?
回复

使用道具 举报

10

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2015-11-11
在线时间
29 小时
 楼主| 发表于 2015-11-24 22:03:51 | 显示全部楼层
而且把加速程序里的下面这个删了也不能正常运行,为什么!?
else
{
if(PWMH==0x02)
{
TR0=1;
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-11-24 22:40:09 | 显示全部楼层
帮顶.....
回复

使用道具 举报

10

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2015-11-11
在线时间
29 小时
 楼主| 发表于 2015-12-3 10:01:05 | 显示全部楼层
回复【4楼】gsndragon:
---------------------------------
差不多懂了,感谢!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 12:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表