步进电机驱动口连接在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
PIC16F72单片机控制的电动自行车C源程序,原理图及设计说明[table=98%][tr][td][color=black][u]PIC16F72单片机控制的电动自行车C源程序,原理图及设计说明[/u][/color][/td][/tr][tr][td]
[table=95%][tr][td]PIC16F72单片机控制的电动自行车驱动系统C程序
PIC单片机控制的电动自行车驱动系统C程序
.46.
#include <pic.h>
//电动车双闭环程序,采用双闭环方式控制电机,以得到最好的zh 转速性能,并且可以
//限制电机的最大电流。本应用程序用到两个CCP 部件,其中CCP1 用于PWM 输出,以控
//制电机电压;CCP2 用于触发AD,定时器TMR2、TMR1,INT 中断,RB 口电平变化中断,
//看门狗以及6 个通用I/O 口
#define AND 0xe0 //状态采集5,6,7 位
#define CURA 0X0a //电流环比例和积分系数之和
#define CURB 0X09 //电流环比例系数
#define THL 0X6400 //电流环最大输出
#define FULLDUTY 0X0FF //占空比为1 时的高电平时间
#define SPEA 0X1d //转速环比例和积分系数之和
#define SPEB 0X1c //转速环比例系数
#define GCURHILO 0X0330 //转速环最大输出
#define GCURH 0X33 //最大给定电流
#define GSPEH 0X67 //最大转速给定
#define TSON 0X38 //手柄开启电压1.1 V,TSON*2 为刹车后手柄开启电压,即
//2.2 V
#define VOLON 0X4c //低电压保护重开电压3.0 V 即33 V
#define VOLOFF 0X49 //低电压保护关断电压2.86 V 即31.5 V
volatile unsigned char DELAYH,DELAYL,oldstate,speed,
speedcount,tsh,count_ts,count_vol,gcur,currenth,
voltage//寄存器定义
static bit sp1,spe,ts,volflag,spepid,lowpower,
off,shutdown,curpid//标志位定义
static volatile unsigned char new[10]={0xaf,0xbe,0xff,0x7e,0xcf,
0xff,0xd7,0x77,0xff,0xff}//状态寄存器表
//------------PIC16F877 初始化子程序------------
void INIT877()
{
PORTC=0X0FF//关断所有MOSFET
TRISC=0X02//设置C 口输出
PIE1=0X00//中断寄存器初始化,关断所有中断
TRISA=0XCF//设置RA4,RA5 输出
TRISB=0XEF//RB 口高三位输入,采集电机三相的霍尔信号
PORTC=new[(PORTB&AND)>>5]//采集第一次霍尔信号,并输出相应的信号,导通
//两个MOS 管
T2CON=0X01//TMR2 4 分频
CCPR1L=0X0FF//初始时PWM 输出全高
CCP1CON=0X0FF//CCP1 设置为PWM 方式
CCP2CON=0X0B//CCP2 设置为特殊方式,以触发AD
ADCON0=0X81//AD 时钟为32 分频,且AD 使能,选择AN0 通道采集手
//柄电压
TMR2=0X00//TMR2 寄存器初始化
TMR1H=0X00//TMR1 寄存器初始化
TMR1L=0X00
T1CON=0X00//TMR1 为1 分频
CCPR2H=0X08
CCPR2L=0X00//电流采样周期设置为TAD=512 μs
PR2=0XC7//PWM 频率设置为5 kHz
ADCON1=0X02//AD 结果左移
OPTION=0XFB//INT 上升沿触发
TMR2ON=1//PWM 开始工作
INTCON=0XD8//中断设置GIE=1,PEIE=1,RBIE=1
ADIE=1//AD中断使能
speedcount=0x00//转速计数寄存器
speed=0x7f//转速保持寄存器
spe=1//低速标志位
sp1=1//低速标志位
oldstate=0x0ff//初始状态设置,区别于其他状态
count_ts=0x08//电流采样8 次,采集1 次手柄
count_vol=0x00//采样256 次手柄,采集1 次电池电压
ts=1//可以采集手柄值的标志位
ADGO=1//AD采样使能
TMR1ON=1//CCP2 部件开始工作
}
//------------延时子程序---------------
#pragma interrupt_level 1
void DELAY1(x)
char x
{
DELAYH=x//延时参数设置
#asm
DELAY2 MOVLW 0X06
MOVWF _DELAYL
DELAY1 DECFSZ _DELAYL
GOTO DELAY1
DECFSZ _DELAYH
GOTO DELAY2
#endasm
}
//-----------状态采集子程序----------------------
void sample()
{
char state1,state2,state3,x
do {
x=1
state1=(PORTB&AND)//霍尔信号采集
DELAY1(x)
state2=(PORTB&AND)
}while(state1-state2)//当三次采样结果不相同时继续采集状态
if(state1-oldstate!=0) //看本次采样结果是否与上次相同,不同
//则执行
{oldstate=state1//将本次状态设置为旧状态
state1=(oldstate>>5)
PORTC=new[state1]//C 口输出相应的信号触发两个MOS 管
if(sp1==1){spe=1sp1=0}
else { //如果转速很低,则spe 置1
spe=0sp1=0
speedcount<<=1
state3=(TMR1H>>2)//否则,spe=0,计转速
speed=speedcount+state3//speed 寄存器为每256 μs 加1
}
speedcount=0
}
}
//-----------------AD 采样子程序----------------------
void AD()
{
char x
ADIF=0//清AD 中断标志位
if(ts==1){ //如果为手柄采样,则采样手柄值
CHS0=1//选择电流采样通道
count_vol=count_vol+1//电池采样计数寄存器
spepid=1//置转速闭环运算标志
ts=0tsh=ADRESH//存手柄值
if(count_vol==0) { //如果电池采样时间到,则选择AN2 通道,采集电池电压
CHS0=0CHS1=1volflag=1x=1DELAY1(x)ADGO=1
}
}
else if(volflag==1) { //电池采样完毕,进行相应的处理
CHS1=0CHS0=1volflag=0voltage=ADRESHlowpower=1
}
else { //否则,中断为采样电流中断
speedcount=speedcount+1//speedcount 寄存器加1,作为测量转速用
if(speedcount>0x3d) sp1=1//如果转速低于1 000 000 μs/(512 μs*3eh*3)
// 则认为为低速状态
currenth=ADRESH
curpid=1
count_ts=count_ts-1
if(count_ts==0) { //如果手柄时间到,则转入手柄采样通道
CHS0=0count_ts=0x08ts=1x=1DELAY1(x)ADGO=1
}
}
}
//-------------刹车处理子程序------------------
void BREAKON()
{
char x
off=0//off清零,如果是干扰则不复位
shutdown=0
if(RB0==1) { //如果刹车信号为真,则停止输出电压
ADIE=0//关AD 中断
INTE=0//关刹车中断
CCPR1L=FULLDUTY//输出电压0
TMR1ON=0//关CCP2,不再触发AD
for(ADGO==1) continue//如正在采样,则等待采样结束
ADIF=0//ADIF 位清零
CHS0=0//选择通道0 采样手柄
CHS1=0
x=1
DELAY1(x)
do {
ADGO=1
for(ADIF==0)continue
ADIF=0
CCPR1L=FULLDUTY
asm("CLRWDT")
tsh=(ADRESH>>1)
}while(tsh>TSON||RB0==1)//当手柄值大于2.2 V 或刹车仍旧继续时,执行以
//上语句
off=1//置复位标志
}
}
//---------欠保护子程序-------------------
void POWER()
{
char x
lowpower=0
voltage>>=1//电压值换为7 位,以利于单字节运算
if(voltage<VOLOFF) { //电池电压小于3*k(V)时保护
ADIE=0
INTE=0
TMR1ON=0
CCPR1L=FULLDUTY
for(ADGO==1)continue
ADIF=0
CHS0=0CHS1=1
x=1
DELAY1(x)
do{ADGO=1
for(ADIF==0)continue
ADIF=0
voltage=(ADRESH>>1)
CCPR1L=FULLDUTY
asm("CLRWDT")
}while(voltage<VOLON)//电池电压小于35 V 时继续保护
off=1//置复位标志
}
}
//------------电流环运算子程序-----------------
void CURPI()
{ static int curep=0x00,curek=0x00,curuk=0x00
union data{int pwm
char a[2]}b//定义电流环运算寄存器
curpid=0//清电流运算标志
curep=curek*CURB//计算上一次偏差与比例系数的积
if(currenth<2)currenth=2//如果采样电流为零,则认为有一个小电流以利于
//使转速下降
currenth>>=1
curek=gcur-currenth//计算本次偏差
curuk=curuk+curek*CURA-curep//按闭环PI 运算方式得到本次输出结果,下
//面对结果进行处理
if(curuk<0x00) { //如果输出小于零,则认为输出为零
curuk=0CCPR1L=FULLDUTYCCP1X=0CCP1Y=0
}
else if(curuk-THL>=0) { //如果输出大于限幅值,则输出最大电压
curuk=THLCCPR1L=0CCP1X=0CCP1Y=0
}
else { //否则,按比例输出相应的高电平时间到CCPR1 寄存器
b.pwm=THL-curuk
b.pwm<<=1
CCPR1L=b.a[1]//CCPR1L=(b.pwm>>8)&0x0ff将PWM 寄存器的高半字节
if(b.pwm&0x80!=0) CCP1X=1
else CCP1X=0
if(b.pwm&0x40!=0) CCP1Y=1
else CCP1Y=0
}
}
//---------------转速环运算子程序-----------------------
void SPEPI()
{ static int speep=0x00,speek=0x00,speuk=0x00
int tsh1,speed1//转速寄存器定义
spepid=0//清转速运算标志
if(spe==1) speed1=0x00//若转速太低,则认为转速为零
else speed1=0x7f-speed//否则计算实际转速
if(speed1<0) speed1=0
speep=speek*SPEB
tsh1=tsh-0x38//得到计算用的手柄值
speek=tsh1-speed1
if(tsh1<0) {speuk=0gcur=0} //当手柄值低于1.1 V 时,则认为手柄给定为零
else { //否则,计算相应的转速环输出
if(tsh1>=GSPEH) //限制最大转速
tsh1=GSPEH
speuk=speuk+speek*SPEA-speep//计算得转速环输出
if(speuk<=0X00) {speuk=0x00gcur=0x00}//转速环输出处理
else if(speuk>GCURHILO) { //转速环输出限制,即限制最大电流约12 A
speuk=GCURHILOgcur=GCURH}
else { //调速状态时的输出
gcur=(speuk>>4)&0x0ff
}
}
}
//-----------主程序-------------------------
main()
{
for(){
INIT877()//单片机复位后,先对其进行初始化
off=0//清复位标志
for(off==0) { //复位标志为零,则执行下面程序,否则复位
if(curpid==1) CURPI()//电流PI 运算
else if(spepid==1) SPEPI()//转速PI 运算
else if(lowpower==1) POWER()
else if(shutdown==1) BREAKON()
asm("CLRWDT")
}
}
}
//---------中断服务子程序---------------------
#pragma interrupt_level 1
void interrupt INTS(void)
{
if(RBIF==1) {RBIF=0sample()}
else if(ADIF==1) AD()
else if(INTF==1) {shutdown=1INTF=0} //刹车中断来,置刹车标志
设计思路:
目 的
目前电动车市场各种功能无刷控制器琳琅满目,种类繁多。普通模拟专用芯片已是穷途末路,而利用单片机控制则能做到“只有想不到,不怕做不到”地步,五花八门的单片机纷纷推向电动车这个新兴的行业。我公司根据电动车市场的流行趋势,制定了无刷控制器的设计方案。
功能概述
目前电动车市场上的控制器分有刷控制器和无刷控制器两大类,由于有刷电机输出扭距小,效率低,需要定期更换炭刷等诸多缺点而逐步被输出扭距大、效率高、使用寿命长的无刷电机取代。根据电动车车型分简易车和豪华车型以及电动摩托车,简易车功率一般在250W以下,而豪华车都在350W以上,设计时必须考虑。简易车的常用功能有1:1助力、巡航、电量及工作状态显示。
工作模式有自动和手动切换两种。豪华车型根据客户的随意性有很多功能,主要有飞车保护、软ABS刹车、反充电、双动力(档位切换)、电机锁(关闭电源电机锁定)等。
为方便调试和防止非法解密,设计采用专用调试工具,外接一个带有键盘和显示器(数码管)的工具来设定一些基本参数,如欠压値、限流、相位选择和工作电压选择等。可以利用单片机内部或外接EEPROM保存设置参数。通过该调试工具达到系列产品的通用性。
主要技术参数
1 基本功能
1.1 工作电压
键盘设定,分12、24、36、48、60、72V档,根据输入电压采样值,确定欠压保护值,单节电池保护电压为10.5V±0.5V,低于该值关闭输出。由于取样电压有相应的误差,用键盘应可以微调。欠压工作方式:当电源电压低于设定值时,关闭输出,当电源电压滞回到大于设定值2V时,开启输出。另一种方式为当电源电压低于电池容量的50%时,相应缩减输出脉宽,以10个百分点逐减,到设定值时减为零即关闭输出,滞回则相反。
1.2 调速电压
调速把输出电压范围为1~4.2V,控制器起点电压应高于1V,控制器的脉宽调制范围应设定为1.38~3.8V,大于3.8V输出为全打开。
1.3 刹车断电
分高电平、低电平和ABS三种方式,高、低电平控制方式由键盘设定,ABS单独引脚控制,该功能如不用时,I/O口可以指定其它功能。
1.4 限流
当取样信号到达设定点时,采用对PWM进行递减的方法,来减小电机电流,使输出电流不超过设定值。即最大输出电流恒定在设定点。设定值由键盘设定,以便调试。
1.5 过流保护:
由于MCU单片机A/D采样速度的因素造成输出电流大于设定值,在这种情况下,设定一个保护值,关闭输出,一般设定为大于限流值2~3A。此值应由键盘设定。
1.6 堵转保护
限流值保持1~3秒后,关闭输出。
1.7 相角选择
60度/120度选择,键盘设定。
1.8 1:1助力
输入3:2占空比的开关信号1~5.5Hz对应调速把的电压信号为2~3.8V,根据输入频率的变化,改变输出PWM的占空比,以控制骑行速度。
1.9 巡航
手动/自动选择由键盘设定,手动按钮低电平有效,按钮按下2秒进入手动巡航方式;自动巡航方式为调速把恒定在某一点8S后(信号电压必须大于启动电压),控制器自动进入巡航方式。
1. 10限速
采用减小PWM脉宽的方法,此值由键盘微调,初始值定义为PWM最大值的45%。低电平为限速方式。
1.11 故障指示
闪1正常、闪2刹车、闪3 RAO、 RBO、闪4 下驱动、闪5上驱动、闪6缺相、闪7 RBO、闪8欠压。故障状态指示利用专用调试器的指示灯指示。
1.12 飞车保护
调速电压>4.5V,上电调速电压>1.5V关闭输出保护。即当调速把地线开路和打开电门锁前调速把已转动时。
1.13 反充电
滑行充电、EBS刹车充电、滑行充电选择,用I/O端口选择,低电平为滑行充电。输出一个指示信号,指示灯亮为充电状态。
2 附加功能
2.1 动态显示
1、故障显示2、电量及骑行状态显示3、速度显示(发光管)
2.2 双动力
根据电机的转速设定一个切换点,该切换点的值由键盘设定。
2.3 档位切换
由一个按钮开关设定三档的速度,初始状态为最低速,按钮的工作方式为按下按钮开关,松开后进入档位状态,档位为循环方式。档位速度可由键盘微调。
2.4 指针仪表
速度分相线输出、霍尔信号、单片机输出。
2.5 防盗锁
输入一个信号锁定电机,推动越快阻力越大(此功能或做成电机锁,电锁关闭后实现)。
2.6 参数设定
显示窗由两部分组成第一部分为功能序号,第二部分为参数值,按键由三个按钮分别代表模式、加、减,设置的参数保存在EEPROM存储器中。设定器与单片机的通讯采用I2 C方式。
无刷电机控制器一般是控制一个无刷电机,目前也有做双电机控制的,但是同时控制四个无刷电机的应该是没有。首先,每一个无刷电机都需要一套独立的驱动电路,如果同时用控制四个无刷电机,需要把四套驱动电路集成在一个电路板上,对于板子的尺寸以及CPU的运算能力都有要求。所以自动化行业一般是通过通讯的方式,由上位机实现对多个电机的同时控制。
深圳市鑫海文科技有限公司致力于直流无刷电机和驱动器定制开发多年,拥有丰富的定制开发和应用经验,在各行业都有成熟应用,支持客户多样化定制要求。详情点击:网页链接
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)