
这个问题不是在这个篇幅内能说清楚的。简短地说,交流电机调速有交流电机的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的直流电机转速程序代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)