用pwm控制直流电机的调速怎么用汇编语言实现?急。。。。。。。。。。。望前辈指教

用pwm控制直流电机的调速怎么用汇编语言实现?急。。。。。。。。。。。望前辈指教,第1张

这哪慧是一个独立控制2路PWM的汇编程序:

2个输出口以高电平为有效输出,也就是当输出100%时为高电平输出,输出0%时为低电平输出。

改变10H-11H的值可以控制2路PWM的占空比变化,例如当10H中的值从0-255变化时候,P1.0输出从0%-100%变化

此程序中频率完全固定不变化,改变10H,11H,12H中的清返值仅改变三路输出的占空比,

频率是完全恒定的.这里PWM波周期为(r7)50usx200=10mS,约为100Hz,晶振用的是12MHz

zzz EQU P1.0 左路马达输出口

yyy EQU P1.1 右路马达输出口

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,#02H50us 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 psw.4 进入区0

clr psw.3

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 R0R1数值减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 psw.4 进入区0

clr psw.3

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 psw.4 进入区0

clr psw.3

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

这是一个 可以输出 三路 不同占空比的 程序明启漏

PWMH1DATA 30H 高电平脉冲的个数

PWMH2DATA 31H

PWMH3DATA 32H

PWM DATA 33H PWM周期

COUNTER DATA 35H

TEMP DATA 36H

ORG0000H

AJMP MAIN

ORG000BH

AJMP INTT0

ORG0100H

MAIN:

MOV SP,#60H 给堆栈指针赋初值

MOV TMOD,#02H 定时器0在模式2下工作

MOV TL0,#38H 定时器每200us产生一次溢激烂出

MOV TH0,#38H 自动重装的值

SETB ET0 使能定时器0中断

SETB EA使能总中断

SETB TR0 开始计时

MOV PWMH1,#2PWM 1 占空比 可以修改

MOV PWMH2,#5PWM 2 占空比 可以修改

MOV PWMH3,#8PWM 3 占空比 可以修改

MOV COUNTER,#0

MOV PWM,#16 占空比 为 16 级 可以修改

JMP $

INTT0:几个参数需要 定义 三路 PWM 占空比 可以不同

PUSH PSW 现场保护

PUSH ACC

INCCOUNTER 计数值加1

MOVA,COUNTER

CJNE A,PWMH1,INTT01 如果等于高电平脉冲数

CLRP1.0P1.0变为低电平 PWM1

INTT01:

CJNE A,PWMH2,INTT02 如果等于高电平脉冲数

CLRP1.1P1.1变为低电平 PWM2

INTT02:

CJNE A,PWMH3,INTT03 如果等于高电平脉冲数

CLRP1.2P1.2变为低电平 PWM3

INTT03:

CJNE A,PWM,INTT05如果等于周期数

MOVCOUNTER,#0 计数器复位

SETB P1.0P1.0为旁型高电平

SETB P1.1P1.1为高电平

SETB P1.2P1.2为高电平

INTT05:

POP ACC 出栈

POP PSW

RETI

END


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

原文地址: http://outofmemory.cn/yw/12514711.html

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

发表评论

登录后才能评论

评论列表(0条)

保存