pwm调无刷电机控制电动车.doc
文本预览下载声明
第14章 单片机控制的电动自行车驱动系统
14.4.4 C语言程序
#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[(PORTBAND)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
显示全部