用单片机对直流电机调速的程序

用单片机对直流电机调速的程序,第1张

很好用的 要求加经啊

#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控制直流电机的调速怎么用汇编语言实现急。。。。。。。。。。。望前辈指教、直流电机控制等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9611272.html

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

发表评论

登录后才能评论

评论列表(0条)

保存