A. 51单片机实现直流电机PWM调速,为什么要用定时器
直流电机的PWM调速,就是改变在一个周期里的通电时间,和断电时间的比,即占空比,而通电时间+断电时间=一个周期,这都是用时间来决定的,当然要用定时器。
B. 基于单片机的pwm小功率直流电机调速
直流调速器就是调节直流电动机速度的设备,上端和交流电源连接,下端和直流电动机连接,直流调速器将交流电转化成两路输出直流电源,一路输入给直流电机砺磁(定子),一路输入给直流电机电枢(转子),直流调速器通过控制电枢直流电压来调节直流电动机转速。同时直流电动机给调速器一个反馈电流,调速器根据反馈电流来判断直流电机的转速情况,必要时修正电枢电压输出,以此来再次调节电机的转速。
直流电机的调速方案一般有下列3种方式:
1、改变电枢电压;
2、改变激磁绕组电压;
3、改变电枢回路电阻。
使用单片机来控制直流电机的变速,一般采用调节电枢电压的方式,通过单片机控制PWM1,PWM2,产生可变的脉冲,这样电机上的电压也为宽度可变的脉冲电压。根据公式
U=aVCC
其中:U为电枢电压;a为脉冲的占空比(0<a<1);VCC直流电压源,这里为5V。
电动机的电枢电压受单片机输出脉冲控制,实现了利用脉冲宽度调制技术(PWM)进行直流电机的变速。
因为在H桥电路中,只有PWM1与PWM2电平互为相反时电机才能驱动,也就是PWM1与PWM2同为高电平或同为低电平时,都不能工作,所以上图中的实际脉冲宽度为B,
我们把PWM波的周期定为1ms,占空比分100级可调(每级级差为10%),这样定时器T0每0.01ms产生一次定时中断,每100次后进入下一个PWM波的周期。上图中,占空比是60%,即输出脉冲的为0.6ms,断开脉冲为0.4ms,这样电枢电压为5*60%=3V。
我们讨论的是可以正转反转的,如果只按一个方向转,我们就只要把PWM1置为高电平或低电平,只改变另一个PWM2电平的脉冲变化即可,,如下图(Q4导通,Q3闭合,电机只能顺时针调整转动速度)
C语言代码:
#include<AT89X52.h>
#define uchar unsigned char
#define uint unsigned int
sbit K5=P1^4;
sbit K6=P1^5;
sbit PWM1=P1^0;
sbit PWM2=P1^1;
sbit FMQ=P3^6;
uchar ZKB1,ZKB2;
void delaynms(uint aa)
{
uchar bb;
while(aa--)
{
for(bb=0;bb<115;bb++) //1ms基准延时程序
{
;
}
}
}
void delay500us(void)
{
int j;
for(j=0;j<57;j++)
{
;
}
}
void beep(void)
{
uchar t;
for(t=0;t<100;t++)
{
delay500us();
FMQ=!FMQ; //产生脉冲
}
FMQ=1; //关闭蜂鸣器
delaynms(300);
}
void main(void)
{
TR0=0; //关闭定时器0
TMOD=0x01; //定时器0,工作方式1
TH0=(65526-100)/256;
TL0=(65526-100)%256; //100us即0.01ms中断一次
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器T0
ZKB1=50; //占空比初值设定
ZKB2=50; //占空比初值设定
while(1)
{
if(!K5)
{
delaynms(15); //消抖
if(!K5) //确定按键按下
{
beep();
ZKB1++; //增加ZKB1
ZKB2=100-ZKB1; //相应的ZKB2就减少
}
}
if(!K6)
{
delaynms(15); //消抖
if(!K6) //确定按键按下
{
beep();
ZKB1--; //减少ZKB1
ZKB2=100-ZKB1; //相应的ZKB2增加
}
}
if(ZKB1>99)
ZKB1=1;
if(ZKB1<1)
ZKB1=99;
}
}
void time0(void) interrupt 1
{
static uchar N=0;
TH0=(65526-100)/256;
TL0=(65526-100)%256;
N++;
if(N>100)
N=0;
if(N<=ZKB1)
PWM1=0;
else
PWM1=1;
if(N<=ZKB2)
PWM2=0;
else
PWM2=1;
}
//显现:电机转速到最高后,也就是N为1或99时,再按一下,就变到99或1,
//电机反方向旋转以最高速度
C. 基于单片机的直流电机PWM调速控制(要单片机的代码)快啊
; PWM 控制 LED 灯渐亮渐灭程序 *
; 利用定时器控制产生占空比可变的 PWM 波 *
; 按K1,PWM值增加,则占空比减小,LED 灯渐暗。 *
; 按K2,PWM值减小,则占空比增加,LED 灯渐亮。 *
;当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警 *
;资源:p0口,8路指示灯。p1.4,p1.5亮度控制按键(端口按键)p3.7小喇叭报警 *
;----
PWM EQU 7FH ;PWM赋初始值
OUT EQU P0 ;8个LED灯的接口
INCKEY EQU P1.4 ;K1,PWM值增加键。
DECKEY EQU P1.5 ;K2,PWM值减小键。
BEEP EQU P3.7
;----
ORG 0000H
SJMP START
ORG 000BH
SJMP INTT0
ORG 001BH
SJMP INTT1
ORG 0030H
;----
;主程序
;定时器0工作在模式1,定时器1工作在模式2。
;----
START:
MOV SP,#30H
MOV TMOD,#21H
MOV TH1,PWM ;脉宽调节
MOV TL1,#00H
MOV TH0,#0FCH ;1ms延时常数
MOV TL0,#066H ;频率调节
SETB EA
SETB ET0
SETB ET1
SETB TR0
LOOP: MOV A,PWM ;
JB INCKEY,LOOP1 ;增加键是否按下?
CALL DELAY ;延时去抖动
JB INCKEY,LOOP1
CJNE A,#0FFH,PWMINC ;是否到最大值?
CALL BEEP_BL ;是,蜂鸣器报警。
SJMP LOOP
PWMINC:
INC PWM ;调节脉宽(脉宽减小)
SJMP LOOP
LOOP1: JB DECKEY,LOOP2 ;减小键是否按下?
CALL DELAY ;延时去抖动
JB DECKEY,LOOP2
CJNE A,#02H,PWMDEC ;是否到最小值?
CALL BEEP_BL ;是,蜂鸣器报警。
SJMP LOOP
PWMDEC:
DEC PWM ;调节脉宽(脉宽增加)
LOOP2: SJMP LOOP
;----
;T0中断服务子程序 (频率)
;控制定时器1中断
;----
INTT0:
CLR TR1
MOV TH0,#0FCH ;1ms延时常数
MOV TL0,#066H ;频率调节
MOV TH1,PWM
SETB TR1
MOV OUT,#00H ;启动输出
RETI
;----
;T1中断服务子程序 (脉宽)
;控制PWM脉冲宽度
;----
INTT1:
CLR TR1 ;脉宽调节结束
MOV OUT,#0FFH ;结束输出
RETI
;----
;10ms延时子程序
;----
DELAY:
MOV R6,#50
DELAY1:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DELAY1
RET
;----
;蜂鸣器响一声子程序
;---
BEEP_BL:
MOV R6,#100
BL1: CALL BL2
CPL BEEP
DJNZ R6,BL1
MOV R5,#25
CALL DELAY2
RET
BL2: MOV R7,#180
BL3: NOP
DJNZ R7,BL3
RET
DELAY2: ;延时R5×10MS
MOV R6,#50
BL4: MOV R7,#100
BL5: DJNZ R7,BL5
DJNZ R6,BL4
DJNZ R5,DELAY2
RET
;---
END
D. 用单片机对直流电机调速的程序
#include<reg52.h> unsigned char pwm_val_right =0;//
变量定义
unsigned char push_val_right=0;//
右电机占空比
N/10
bit Right_moto_stop=1;
unsigned
int
time=0;
sbit k1=P3^5;
sbit k2=P3^4;
sbit Right_moto_pwm=P1^2;
sbit IN1=P1^0;
sbit IN2=P1^1;
/************************************************************************/
void delay(unsigned int k)
//
延时函数
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
/************************************************************************/
void
run() //前进函数
{
push_val_right =10;
//PWM
调节参数
1-10
1为最慢,
10是最快
改这个值可
以改变其速度
IN1=0;
IN2=1;
}
/************************************************************************/
void
run_1() //前进函数
{
push_val_right =3;
//PWM
调节参数1-10
1为最慢,10是最快
改这个值可以改变其速度
IN1=0;
IN2=1;
}
/************************************************************************/
/*
PWM调制电机转速
*/
/************************************************************************/
/******************************************************************/
/*
右电机调速
*/
void pwm_out_right_moto(void)
{
if(Right_moto_stop)
{
if(pwm_val_right<=push_val_right)
Right_moto_pwm=1;
else
Right_moto_pwm=0;
if(pwm_val_right>=10)
pwm_val_right=0;
}
else
Right_moto_pwm=0;
}
void main(void)
{
TMOD=0X01;
TH0= 0XF8;
//1ms
定时
TL0= 0X30;
TR0= 1;
ET0= 1;
EA = 1;
while(1)
{
//
此处函数自己写
}
}
/***************************************************/
/*TIMER0
中断服务子函数产生
PWM
信号
*/
/***************************************************/
void timer0() interrupt 1
using 2
{
TH0=0XF8;
//1Ms定时
TL0=0X30;
time++;
pwm_val_right++;
pwm_out_right_moto();
}
E. 基于单片机的直流电机PWM调速控制(要单片机的代码)快啊
; PWM控制直流电机速度程序 *; 利用定时器生成可变占空比的PWM波 *; 按下K1键,PWM值增加,占空比减小,电机速度降低。 *; 按下K2键,PWM值减小,占空比增加,电机速度提高。 *; 当PWM值达到最大或最小时,蜂鸣器发出报警声。 *; 资源:P0口,直流电机接口。P1.4,P1.5速度控制按键(端口按键)P3.7小喇叭报警 *; --------------------------------- PWM EQU 7FH ; PWM的初始值 OUT EQU P0 ; 直流电机接口 INCKEY EQU P1.4 ; K1,增加PWM值键 DECKEY EQU P1.5 ; K2,减少PWM值键 BEEP EQU P3.7; ----------------- ORG 0000H SJMP START ORG 000BH SJMP INTT0 ORG 001BH SJMP INTT1 ORG 0030H; ------------------; 主程序; 定时器0工作在模式1,定时器1工作在模式2。; ------------------START: MOV SP,#30H MOV TMOD,#21H MOV TH1,PWM ; 脉宽调节 MOV TL1,#00H MOV TH0,#0FCH ; 1ms延时常数 MOV TL0,#066H ; 频率调节 SETB EA SETB ET0 SETB ET1 SETB TR0 LOOP: MOV A,PWM ; 读取PWM值 JB INCKEY,LOOP1 ; 增加键是否按下? CALL DELAY ; 延时去抖动 JB INCKEY,LOOP1 JNB DECKEY,LOOP2 ; 减少键是否按下? CALL DELAY ; 延时去抖动 JNB DECKEY,LOOP2 CJNE A,#0FFH,PWMINC ; 是否达到最大值? CALL BEEP_BL ; 是,蜂鸣器报警 SJMP LOOPPWMINC: INC PWM ; 调节脉宽(脉宽减小) SJMP LOOPLOOP1: JB DECKEY,LOOP2 ; 减少键是否按下? CALL DELAY ; 延时去抖动 JB DECKEY,LOOP2 CJNE A,#02H,PWMDEC ; 是否达到最小值? CALL BEEP_BL ; 是,蜂鸣器报警 SJMP LOOPPWMDEC: DEC PWM ; 调节脉宽(脉宽增加) LOOP2: SJMP LOOP; ------------------; T0中断服务子程序 (频率); 控制定时器1中断; ------------------INTT0: CLR TR1 MOV TH0,#0FCH ; 1ms延时常数 MOV TL0,#066H ; 频率调节 MOV TH1,PWM SETB TR1 MOV OUT,#00H ; 启动输出 RETI; ------------------; T1中断服务子程序 (脉宽); 控制PWM脉冲宽度; ------------------INTT1: CLR TR1 ; 脉宽调节结束 MOV OUT,#0FFH ; 结束输出 RETI; ------------------; 10ms延时子程序; ------------------DELAY: MOV R6,#50 DELAY1: MOV R7,#100 DJNZ R7,$ DJNZ R6,DELAY1 RET; ------------------; 蜂鸣器响一声子程序; ----------------BEEP_BL: MOV R6,#100 BL1: CALL BL2 CPL BEEP DJNZ R6,BL1 MOV R5,#25 CALL DELAY2 RET BL2: MOV R7,#180 BL3: NOP DJNZ R7,BL3 RET DELAY2: ; 延时R5×10MS MOV R6,#50 BL4: MOV R7,#100 BL5: DJNZ R7,BL5 DJNZ R6,BL4 DJNZ R5,DELAY2 RET; ------------------ END