怎样用汇编语言编写pwm电机调速程序

怎样用汇编语言编写pwm电机调速程序,第1张

这个问题不是在这个篇幅内能说清楚的。简短地说,交流电机调速有交流电机的pwm驱动方式,直流电机调速有直流电机的pwm驱动方式。

交流电机的pwm调速原理,主要通过一个频率可变的交流低频信号,去调制一个高频方波驱动电压,从而在电机电枢中得到一个随调制信号频率变化的驱动电流。于是交流电机电枢就在这个电流驱动下,产生与调制信号频率一致的旋转磁场,使得电机转子旋转速度发生改变。它的调制方式是调频。

直流电机的pwm调速原理与交流电机调速原理不同,它不是通过调频方式去调节电机的转速,而是通过调节驱动电压脉冲宽度的方式,并与电路中一些相应的储能元件配合,改变了输送到电枢电压的幅值,从而达到改变直流电机转速的目的。它的调制方式是调幅。

/-----------------------------------------------

名称:独立按键控制直流电机调速

使用5V-12V 小功率电机皆可 2个按键分别加速和减速

------------------------------------------------/

#include<reg52h>

#define KeyPort P3

sbit DCOUT = P1^1;//定义电机信号输出端口

unsigned char PWM_ON; //定义速度等级

#define CYCLE 10 //周期

/------------------------------------------------

函数声明

------------------------------------------------/

void DelayUs2x(unsigned char t);//us级延时函数声明

void DelayMs(unsigned char t); //ms级延时

unsigned char KeyScan(void);//键盘扫描

void Init_Timer0(void);//定时器初始化

/------------------------------------------------

主函数

------------------------------------------------/

void main (void)

{

unsigned char num;

PWM_ON=0;

Init_Timer0(); //初始化定时器0,主要用于数码管动态扫描

while (1) //主循环

{

num=KeyScan(); //循环调用按键扫描

if(num==1)//第一个按键,速度等级增加

{

if(PWM_ON<CYCLE)

PWM_ON++;

}

else if(num==2)//第二个按键,速度等级减小

{

if(PWM_ON>0)

PWM_ON--;

}

}

}

/------------------------------------------------

uS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编,大致延时

长度如下 T=tx2+5 uS

------------------------------------------------/

void DelayUs2x(unsigned char t)

{

while(--t);

}

/------------------------------------------------

mS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编

------------------------------------------------/

void DelayMs(unsigned char t)

{

while(t--)

{

//大致延时1mS

DelayUs2x(245);

DelayUs2x(245);

}

}

控制直流电机的原理一般都是用PWM实现的。

这是51单片机来控制直流电机转速的程序,如果是AVR可以用AVR单片机自带的PWM来控制电机的转速。

通过控制总中断使能PDPINTA控制电机的开关,其中定时器T1,T2分别对脉冲的宽度、光电传感器输出的脉冲数对应的1秒时间定时。对脉冲宽度的调整是通过改变高电平的定时长度,由变量high控制。变量change、 sub_speed 、add_speed分别实现电机的转向、加速、减速。

41系统初始化模块

/主函数/

void main()

{

P2 = 0x00;

TMOD = 0x11;

TH1 = 0xec; //定时器T1设置参数

TL1 = 0x78;

TH2 = 0x3c; //定时器T2设置参数

TL2 = 0xb0;

TR1 = 1;

TR2 = 1;

init(); //液晶显示初始化程序

while(1)

{

Wc2407r(0x84);

wc2407ddr('H');

wc2407ddr('e');

wc2407ddr('l');

wc2407ddr('l');

wc2407ddr('o');

if(test == 0)

num_medium++;

datamade();

motor_control();

}

}

42 电机运行控制模块

电机运行控制模块包括电机的方向控制和电机的速度控制,他们由Open,close,addspeed,subspeed,swap变来控制2407单片机的EVA模块产生不同的PWM信号送到L298 电机驱动器。

/通过按键实现对电机开关、调速、转向的控制的程序/

void motor_control()

{

if(open == 1)

PDPINTA = 1;

if(close == 1)

PDPINTA = 0;

if(swap == 1)

{

change = ~change;

while(swap != 0)

{}

}

if(sub_speed == 1)

{ high++;

if(high == 30)

PDPINTA=0;

while(sub_speed != 0)

{}

}

if(add_speed == 1)

{ high--;

if(high == 5)

high = 5;

while(add_speed != 0)

{}

}

}

/T2中断服务程序单位时间(S)方波的个数/

void time2_int(void) interrupt 3

{

count_speed++;

if(count_speed == 20)

{ count_speed = 0;

num_display = num_medium;

num_medium = 0;

}

}

/速度显示的数据处理/

void datamade()

{

uint data MM

Wc2407r(0xc2);

wc2407ddr('S');

wc2407ddr('p');

wc2407ddr('e');

wc2407ddr('e');

wc2407ddr('d');

wc2407ddr(0x3a);

MM = num_display/100;

wc2407ddr(wword[MM]);

}

44LCD显示模块

LCD显示驱动单独做成一个源程序文件和头文件,可以方便以后其他模块或其他应用程序的调用。在LCD显示驱动模块中主要是LCD初始化函数LCD_Initize()、写LCD命令函数Write_LCD_Command()、写LCD数据函数Write_LCD_Data()

TS1620可以显示两行16列ASCII码,其对应的第一行的首行地址是80H;第二行的首地址是C0H,送字符串到LCD上显示,需要定位将字符串显示在第X行和第Y列上,显示的字符串不能超过该行的最大列。

#include <reg2407h>

#define uchar unsigned char

#define uint unsigned int

sbit open = P2^0;

sbit close = P2^1;

sbit swap = P2^2;

sbit sub_speed = P2^3;

sbit add_speed = P2^4;

sbit PWM1 = P3^0;

sbit PWM2 = P3^1;

/液晶显示/

sbit E=P3^7;

sbit RW = P3^6;

sbit RS = P3^5;

sbit test = P3^4;

int time = 0;

int high = 20;

int period = 30;

int change = 0;

int flag = 0;

int num_medium = 0;

int num_display = 0;

int count_speed = 0;

uchar wword[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};

/延时t毫秒/

void delay(uchar t)

{

uint i;

while(t)

{

/对于110592MHz时钟,延时1ms/

for(i=0;i<125;i++);

t--;

}

}

//写命令函数LCD

void Write_LCD_Command(){

RS=0;

RW=0;

P1=j;

E=1;

E=0;

delay(3);

}

//写数据函数LCD

void Write_LCD_Data()

{

RS=1;

RW=0;

P1=j;

E=1;

E=0;

delay(2);

}

//初始化函数LCD

void LCD_Initize(){

wc2407r(0x01); //清屏

wc2407r(0x38); //使用8位数据,显示两行,使用57的字型

wc2407r(0x0c); //显示器件,光标开,字符不闪烁

wc2407r(0x06); //字符不动,光标自动右移一格

}

44 PWM 源程序

/8T1中断服务程序PWM波的生成/

void time1_int(void) interrupt 1

{

time++;

TH1 = 0xec;

TL1 = 0x78;

if(change == 0)

{

PWM2 = 1;

if(time == high)

PWM1=0;

else if(time == period)

{

PWM1 = 1;

time = 0;

}

}

else

{ PWM1 = 1;

if(time == high)

PWM2=0;

else if(time == period)

{

PWM2 = 1;

time = 0;

}

}

}

这个程序以前做遥控小车的时候写过,很长,不过控制L298的很短的,楼主只需要控制 L298的ENA,ENB,IN1,2,3,4的高电平时间长短,也就是占空比就可以控制左右电机的速度了,原理自己百度文库很简单的,我是用定时器控制的,没办法,52单片机没PWM功能,呵呵

以上就是关于怎样用汇编语言编写pwm电机调速程序全部的内容,包括:怎样用汇编语言编写pwm电机调速程序、直流电机转速C51 程序怎么做、基于89c51的直流电机转速程序代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9855285.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存