很好用的 要求加经啊
#include<reg51h>
#include<intrinsh>
sbit S2 =P3^4 ; //PWM值减少键
sbit S3 =P3^5 ; //PWM值增加键
sbit BEEP =P2^3 ; //蜂鸣器
unsigned char PWM=0x03 ; //赋初值
///////////////////////////////////////
sbit dula=P2^6; //数码管的段选信号
sbit wela=P2^7; //数码管的位选信号
void delay1 (void) //关闭数码管延时程序
{
int k;
for (k=0; k<1000; k++);
}
//////////////////////////////////////
void Beep();
void delayms(unsigned char ms);
void delay(unsigned char t);
//
void main()
{
P1=0xff;
TMOD=0x00 ;
TH0=0x00 ; //延时常数
TL0=0x00 ; //频率调节
TH1=PWM ; //脉宽调节
TL1=0xff ;
EA=1;
ET0=1;
ET1=1;
TR0=1 ;
/////////////////////////////////////////////////////////////////
P0=0x00;//关掉数码管的信号。阻止数码管受到P0口信号的影响。
dula=1;
wela=0;
delay1();
dula=0;
wela=0;
delay1();
////////////////////////////////////////////////////////////////
while(1)
{
do{
if(PWM!=0xff)
{PWM++ ;delayms(10);}
else Beep() ;
}
while(S3==0);
do{
if(PWM!=0x02)
{PWM-- ;delayms(10);}
else Beep() ;
}
while(S2==0);
}
}
//
// 定时器0中断服务程序 (频率)
//
void timer0() interrupt 1
{
TR1=0 ;
TH0=0x00;
TL0=0x00 ;
TH1=PWM ;
TR1=1 ;
P0=0x00 ; //启动输出
}
//
// 定时器1中断服务程序 (脉宽)
//
void timer1() interrupt 3
{
TR1=0 ;
P0=0xff ; //结束输出
}
//
//蜂鸣器子程序
//
void Beep()
{
unsigned char i ;
for (i=0 ;i<100 ;i++)
{
delay(100) ;
BEEP=!BEEP ; //Beep取反
}
BEEP=1 ; //关闭蜂鸣器
delayms(100);
}
//
// 延时子程序
//
void delay(unsigned char t)
{
while(t--) ;
}
//
// 延时子程序
//
void delayms(unsigned char ms)
{
unsigned char i ;
while(ms--)
{
for(i = 0 ; i < 120 ; i++) ;
}
}
//
;这是一个独立控制2路PWM的汇编程序:
;2个输出口以高电平为有效输出,也就是当输出100%时为高电平输出,输出0%时为低电平输出。
;改变10H-11H的值可以控制2路PWM的占空比变化,例如当10H中的值从0-255变化时候,P10输出从0%-100%变化
;此程序中频率完全固定不变化,改变10H,11H,12H中的值仅改变三路输出的占空比,
;频率是完全恒定的这里PWM波周期为(r7)50usx200=10mS,约为100Hz,晶振用的是12MHz
zzz EQU P10 ;左路马达输出口
yyy EQU P11 ;右路马达输出口
ld1 EQU 10H ;左路马达,即占空比的比值,0-255变化
ld2 EQU 11H ;右路马达,即占空比的比值,0-255变化
ORG 0000H
LJMP mm
ORG 000BH
LJMP t000
;主程序段
org 0100h
mm:nop ;复位程序
mov r4,#00h ;延时1秒用
mov r5,#00h
mov r6,#05h
MOV SP,#5fH
MOV P1,#0FFH ; P1置高,关闭全部灯
MOV 10h,#0fH ;给左路马达赋值,0ffh为速度最快,00h为最慢
MOV 11h,#8fH ;给右路马达赋值,0ffh为速度最快,00h为最慢
mov r0,10h ;将左路的赋值送进左路缓存
mov r1,11h ;将右路的赋值送进右路缓存
MOV TMOD,#02H ;50us t0方式2自动重装
mov tcon,#00h
MOV TH0,#0cdH
MOV TL0,#0cdH
mov r7,#200 ;设定周期数据
SETB EA
SETB ET0
SETB TR0
mov 20h,#00h
m0:acall ys00 ;延时1秒
;acall pwm ;改变速度子程序
sJMP m0
;定时器t0中断子程序<占用区0>
org 0180h
t000: ;50us t0中断子程序,用于实现三路PWM输出
PUSH ACC
PUSH PSW
clr psw4 ;进入区0
clr psw3
CJNE R7,#00H,AA ;从这里是程序的精华,检测R7值是否为0,等于0则下一条重新赋值,否则跳到AA
MOV R7,#200 ;R7重新赋值
setb 07h ;设置改变pwm数据标志位
MOV R0,10h ;把左路速度值复制给R1
MOV R1,11h ;把右路速度值复制给R2
AA:CJNE R0,#00H,BB ;判断控制左路的值是否(或是否被减为0)为0,是则下一条关闭左路,否则跳到BB
SETB zzz ;关闭左路
sJMP CC ;跳到CC检测右路
BB:CLR zzz ;打开(或继续打开)左路
DEC R0 ;R1数值减1
CC:CJNE R1,#00H,DD ;这里控制右路与上面左路原理一样
SETB yyy
sJMP GG
DD:CLR yyy
DEC R1
GG: DEC R7 ;把R7的值减1,R7的初始值是#200h
POP PSW
POP ACC
RETI
;延时1秒时间子程序
org 0200h
ys00:push dph
push dpl
push acc
push psw
clr psw4 ;进入区0
clr psw3
ys1:djnz r4,ys1
ys2:djnz r5,ys1
ys3:djnz r5,ys1
mov r4,#00h
mov r5,#00h
mov r6,#05h
acall pwm
pop psw
pop acc
pop dpl
pop dph
ret
;pwmr改变pwm时间子程序
org 0280h
pwm:jb 07h,pwm1 ;一个完整周期到否?
ret ;未到则返回
pwm1:push acc
push psw
clr psw4 ;进入区0
clr psw3
mov a,10h
cjne a,#0ffh,pwm3 ;未到最大则继续
mov 10h,#0fh
sjmp pwm4
pwm3:mov a,10h
add a,#10h
mov 10h,a
pwm4:mov a,11h
cjne a,#0ffh,pwm6 ;未到最大则继续
mov 11h,8fh
sjmp pwm11
pwm6:mov a,11h
add a,#10h
mov 11h,a
pwm11:clr 07h
pop acc
pop psw
ret
END
可以,给直流电机后面加装编码器,使用直流电机控制器 比如欧陆590控制其达到设定值转的圈数就停止。
编码器:编码器是一个高速计数器,一圈1000个脉冲输出,也有200 500 800 2000 等等,
比如选择好1000的脉冲编码器,那么直流电机转动一圈就需要1000个脉冲信号输出,少一个脉冲或者多一个脉冲都不对。你可以想象一下,一个直流电机转动一圈就是1000个脉冲,那么没转动1个脉冲,直流电机转动的距离基本是你看不见。转动超过500个脉冲那么直流电机就转了半圈了。
欧陆590:欧陆590是专业控制直流电机的调速系统,其优点就是通讯和控制系统很强大,可以对直流电机控制到任何一种状态运行,例如你所说的转动到一定圈数停止,那么欧陆590就可以做到这么一点,立即停止电机。
PLC:可编程控制器,对编码器过来的脉冲信号进行控制区分设定,从而来控制欧陆590在什么时候立即停止运行,比如PLC检测到了10000个脉冲,立即切断给欧陆590控制器的模拟量电源,直流电机也就做到了转动10圈并立即停止的功能。
直流电机 单片机端口是不能直接供电的 电流太小 带动不了直流电机
要用电机驱动芯片
比较简单和常用的是 l298 电机驱动芯片
关于它的data sheet 网上很多 小搜索一下就有了
引脚资料和电机连接方式上面都有
l298 可以控制两个电机的正反转 如果你不用调速的话那就相当简单了
程序例如:
input a ,input b,enable(这三个都是芯片引脚的名字) 分别用单片机的
p10 p11 p12控制 output a(引脚名字) 接电机
程序:
clr p1
setb p10
setb p11(正转)
clr p1
setb p11
setb p11 (反转)
超简单的 电机控制芯片还有很多例如 摩托罗拉公司的 mc33886 也可以
以上就是关于用单片机对直流电机调速的程序全部的内容,包括:用单片机对直流电机调速的程序、用pwm控制直流电机的调速怎么用汇编语言实现急。。。。。。。。。。。望前辈指教、直流电机控制等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)