215
第 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 口高三位输入,采集电机三相的霍尔信号