如何用Pwm控制直流电机,使小车缓慢启动缓慢停止,求C51程序 最好有PWM S型曲线数组

如何用Pwm控制直流电机,使小车缓慢启动缓慢停止,求C51程序 最好有PWM S型曲线数组,第1张

调其中的speed,即时调整占空比,调t即是调周期的长短

/* 晶振采用11.0592M,产生的PWM的频率约为91Hz */

#include<reg51.h>

#include<math.h>

#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(jj>0j--)

}

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=0i<=100i++) /* 正转加速 */

{

motor(1,i)

delay(5000)

}

for(i=100i>0i--) /* 正转减速 */

{

motor(1,i)

delay(5000)

}

for(i=0i<=100i++) /* 反转加速 */

{

motor(1,-i)

delay(5000)

}

for(i=100i>0i--) /* 反转减速 */

{

motor(1,-i)

delay(5000)

}

}

}

void timer0() interrupt 1 /* T0中断服务程序 */

{

if(t==0) /* 1个PWM周期完成后才会接受新数值 */

{

tmp1=m1

tmp2=m2

}

if(t<tmp1) en1=1else en1=0/* 产生电机1的PWM信号 */

t++

if(t>=100) t=0/* 1个PWM信号由100次中断产生 */

}

主程序和中断程序入口 *

**

*************************************

ORG 0000H程序执行起始地址

LJMP START 跳至START

ORG 0003H外中断0入口

LJMP INTEX0 跳至INTEX0中断服务程序

ORG 000BH定时器T0中断入口

RETI 中断返回

ORG 0013H外中断1入口

LJMP INTEX1 跳至INTEX1中断服务昌毁程序

ORG 001BH定时器T1中断入口

LJMP INTT1 跳至INTT1中断服务程序

ORG 0023H串口锋迅毁中断入口

RETI 中断返回

ORG 002BH定时器T2中断入口

RETI 中断返回

***************************

* *

*初始化程序 *

* *

****************************

CLEARMEMIO: MOVR0, #70H 清70H-76H显示单元

MOVR7, #07H 循环次数

ML0: MOV@R0, #00H 清0

INCR0 下一地址

DJNZ R7, ML0未完再循环

MOVTMOD,#10H T1为16位定时器

MOVR4,#14H1秒定时用(50毫秒20次)

MOVTL1,#0B0H 50毫秒定时用初值

MOVTH1,#3CH

MOV 20H,#00H 清0 *** 作

MOV 21H,#00H

MOV 22H,#00H

MOV 23H,#00H

MOV 24H,#00H

CLR 30H 清停车标志

SETB ET1 开银备T1中断

SETB EX1 开外中断1

SETB IT1 外中断1采用边沿触发

SETB IT0 外中断0优先级为1(最高)

SETB EX0 开外中断0

SETBEA 开总中断允许

SETBTR1 开启定时器T1

RET 子程序返回

*************************************

**

*主 程 序*

**

*************************************

START: LCALLCLEARMEMIO 上电初始化

SETB P1.6 选择7.5V输出

CLR P1.7 选择7.5V输出

SETB P3.7 前进状态

CLR P3.6 前进状态

CLR P1.0 电机供电开始

;MAIN:LCALLDISP LED显示一次

LJMP MAIN 转MAIN循环

NOP PC值出错处理

NOP

LJMP START 重新初始化

*************************************

**

*外中断0服务程序,用作跑道位置处理 *

*23H作跑道计数器 *

*************************************

INTEX0:PUSH ACC 堆栈保护

PUSH PSW

CLR EX0 关中断

LCALLDISP LED显示一次(延时抗干扰)

JB P3.2,IN0RET P3.2为1退出(干扰)

INC 23H 跑道计数器加1

MOV A,23H 数据入A

CJNE A,#06H,JUDGE1 不是第6道转JUDGE1

LCALLSTOP 是第6道,停车

LJMP IN0RET 转中断退出

JUDGE1:CJNE A,#03H,JUDGE2 不是第3道转JUDGE2

LCALLSTOPSLOW 是第3道,变慢车

LJMP IN0RET 转中断退出

JUDGE2:CJNE A,#04H,JUDGE3 不是第4道转JUDGE3

LCALLFAST 是第4道,变快车

LJMP IN0RET 转中断退出

JUDGE3:CJNE A,#05H,IN0RET 不是第5道转INORET退出

LCALLSTOPSLOW 是第5道,变慢车

IN0RET:CLR IE0 清外中断0中断标志

POP PSW 恢复现场

POP ACC

LCALLDL7MS 延时7毫秒(抗干扰)

SETB EX0 开外中断0

RETI 中断返回

************************************

* 慢车控制子程序 *

************************************

STOPSLOW: CLR P1.6 关7.5V电源

CPL P3.6 反向驱动(刹车)

CPL P3.7 反向驱动

LCALLDS50MS 刹车时间(可根据试车情况调整)

LCALLDS50MS

LCALLDS50MS

CPL P3.6 正向驱动

CPL P3.7 正向驱动

SETB P1.7 开4.3V电源

RET 返回

************************************

* 快车控制子程序*

************************************

FAST: CLR P1.7 关4.3V电源

SETB P1.6 开7.5V电源

RET 返回

************************************

* 停车控制程序 *

************************************

STOP: MOV 23H,#00H 跑道计数单元清0

CPL P3.6 反向驱动(刹车)

CPL P3.7 反向驱动(刹车)

LCALLDS50MS 刹车时间

LCALLDS50MS 刹车时间(可调整)

SETBP1.0 关电机电源

SETBPT1 定时器T1为高优先级

LCALLDS10S 停车10秒

CLR PT1 恢复T1为低优先级

SETB P1.6 开7.5V电源(高速)

CLR P1.7 关4.3V

CLR P1.0 电机电源开

CPL 30H 停车点位置判断标志取反

JB 30H,STREN 为1(中途停车)转STREN

LCALLCLR00 是终点,调复0程序

STREN:RET 返回

可以在小车上搭载一个变速装置。

可以在各大浏览器上搜索速度更改程序,先用低速让小车跑一段距离,再用高速让小车跑。用同样的方法在ev3里写程序态乎宏就可以了,先用移动转向模块控制小车低速跑,再用另一个移动转向模块控制小车高速跑。

将马达模块放在循环模块之内,用等待模块控制单次循环时间,电机模块设为开启模式顷链,帆册每次循环功率值均固定增加一个值。然后在程序上实现提速,提速之后小车的车速会明显提高,但不会特别特别快。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12368762.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存