pic用pwm方式如何控制直流电机的程序 按键按一下增加转速 另一个按键按一下减少转速

pic用pwm方式如何控制直流电机的程序 按键按一下增加转速 另一个按键按一下减少转速,第1张

这几天在学PIC16F877A 参照郭天祥的按键检测 还有一个兄弟的PWM控制 学的

///////////////////////////////////////////////////////////////

////////A端口 数码管(共阴)的位选/////D端口数码管 段选

/////////RB0~3 按键(+上拉电阻) RC2 输出 蜂鸣器RE0

#include<pic.h>

#define uchar unsigned char

#define uint unsigned int

__CONFIG(0x3B31)

const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}

uchar key_num,a,b,c

int pwm

bit pwmflag=0

void delay(uint x)

void init()

void scan()

void didi(uchar num)

void disp(uchar num1,uchar num2,uchar num3,uchar num4,uchar num5,uchar num6)

void main()

{

init()

while(1)

{

T2CON=0X7f //打开定时器2

PR2=255 //PWM 的工作周期(可以调整频率1/T)=(PR2+1)*4*Tosc*TMR2预分频比

CCPR1L=pwm //PWM匹配初值,调整占空比:x/y-PR2(PR2设定)

CCP1CON=0X3C//设置CCP1 模块为PWM 工作方式

TRISC=0XFB//设置CCP1 引脚为输出方式

//delay(20)

//if(pwmflag=0){pwm++}

// if(pwm>=255){pwmflag=1}

// if(pwmflag=1){pwm--}

// if(pwm<=30){pwmflag=0}

a=pwm/100b=pwm%100/10c=pwm%10

scan()

disp(key_num,2,3,a,b,c)

}

}

void delay(uint x)

{

uint a,b

for(a=xa>0a--)

for(b=110b>0b--)

}

void init()

{

TRISB=0xff

TRISD=0

TRISA=0

TRISE0=0

RE0=0

PORTD=0

PORTA=0

}

void scan()

{

if(RB0==0)

{

delay(10)

if(RB0==0)

{ pwm++

if(pwm>=255){pwm=1}

didi(1)

while(!RB0)

{

disp(key_num,2,3,a,b,c)

key_num=1//PORTD=0x01

}

}

}

if(RB1==0)

{

delay(10)

if(RB1==0)

{ pwm--

if(pwm<=1){pwm=255}

didi(1)

while(!RB1)

{

disp(key_num,2,3,a,b,c)

key_num=2//PORTD=0x02}

}

}

}

if(RB2==0)

{

delay(10)

if(RB2==0)

{ pwm+=50

if(pwm>=255){pwm=1}

didi(1)

while(!RB2)

{

disp(key_num,2,3,a,b,c)

key_num=3//PORTD=0x04

}

}

}

if(RB3==0)

{

delay(10)

if(RB3==0)

{ pwm-=50

if(pwm<=1){pwm=255}

didi(1)

while(!RB3)

{

disp(key_num,2,3,a,b,c)

key_num=4//PORTD=0x08

}

}

}

}

void didi(uchar num) //蜂鸣器

{

uchar di_num

for(di_num=numdi_num>0di_num--)

{

RE0=1

delay(50)

RE0=0

delay(20)

}

}

////////A端口 数码管(共阴)的位选/////D端口数码管 段选

void disp(uchar num1,uchar num2,uchar num3,uchar num4,uchar num5,uchar num6)

{

PORTD=table[num1]//显示第一个数码管

PORTA=0x20//0010 0000

delay(2)

PORTD=table[num2]//显示第二个数码管

PORTA=0x10//0001 0000

delay(2)

PORTD=table[num3]//显示第三个数码管

PORTA=0x08//0000 1000

delay(2)

PORTD=table[num4]//显示第四个数码管

PORTA=0x04//0000 0100

delay(2)

PORTD=table[num5]//显示第五个数码管

PORTA=0x02//0000 0010

delay(2)

PORTD=table[num6]//显示第六个数码管

PORTA=0x01//0000 0001

delay(2)

}

4相4拍步进电机,步进角为7.5

步进电机驱动口连接在RA0-RA3

include<p16f877a.inc> 包含877A的头文件

__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC

芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡

#define step1 9h 转动第1步驱动信号(不同的电机,可以引出线顺序不一样)

#define step2 0ch 转动第2步驱动信号(本程序以“常州市丰源微特电记有限公司的35BY48S053”电机为基础)

#define step3 6h 转动第3步驱动信号

#define step4 3h 转动第4步驱动信号

countequ 20h

org 00h 复位入口

nop ICD所需要的空指令

goto main 跳转到主程序

org 05h

****************************主程序***************************

main

banksel adcon1

movlw 07h

movwf adcon1设置所有A口为普通数字口

banksel trisa

clrf trisa 设置A口为输出

clrf status

clrf porta

movlw .12电机旋转一周需循环次数 360/(7.5*4)

movwf count

loop

movlw step1 第1步

movwf porta

call delay

movlw step2 第2步

movwf porta

call delay

movlw step3 第3步

movwf porta

call delay

movlw step4 第4步

movwf porta

call delay

decfsz count,1是否旋转完一周

goto loop 否,继续转动

clrf porta 是,停止转动

goto $-1停机

*******************************延时程序********************************

控制输出的频率

delay

movfw 0FH

movwf 21h

movlw 0ffh

movwf 22h

decfsz 22h,1

goto $-1

decfsz 21h,1

goto $-5

return

******************************源程序结束*******************************

end


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

原文地址:https://54852.com/yw/7858015.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存