📄 stc5404ad无刷控制器.c
字号:
//*****************************************************
//* ***无刷电机控制器程序*** *
//*===================================================*
//* C语言版本 *
//* MCU-STC12C5404AD 8路AD转换,4路PWM输出,速度1T *
//* 编程语言:高级语言C *
//* 程序员:张建华 高级语言编程时间:07-05-03 *
//*===================================================*
//* JH单片机工作室设计开发 *
//* 版权所有未经同意不得用于商业用途 *
//* 本软件版权单位:瑞安市恒信汽车配件厂 *
//*****************************************************
#include<reg51.h> //包含文件预处理命令
#define uchar unsigned char //8位单片机习惯性定义
#define uint unsigned int //8位单片机习惯性定义
//
//*********AD转换要用到的特殊寄存器地址定义*************************************
sfr adc_contr=0xc5; //定义AD转换控制寄存器地址
sfr adc_data=0xc6; //定义AD转换结果寄存器地址
sfr p1m0=0x91; //带有8路AD的P1口模式选择寄存器0定义地址
sfr p1m1=0x92; //带有8路AD的P1口模式选择寄存器1定义地址
//
//*********PWM输出要用到的特殊寄存器地址定义************************************
sfr ccap0h=0xfa; //PCA模块0捕捉/比较寄存器高8位
sfr ccap1h=0xfb; //PCA模块1捕捉/比较寄存器高8位
sfr ccap2h=0xfc; //PCA模块2捕捉/比较寄存器高8位
sfr ccap3h=0xfd; //PCA模块3捕捉/比较寄存器高8位
sfr pca_pwm0=0xf2; //PCA模块0-PWM寄存器
sfr pca_pwm1=0xf3; //PCA模块1-PWM寄存器
sfr pca_pwm2=0xf4; //PCA模块2-PWM寄存器
sfr pca_pwm4=0xf5; //PCA模块3-PWM寄存器
sfr ccapm0=0xda; //PCA模块0工作模式寄存器
sfr ccapm1=0xdb; //PCA模块1工作模式寄存器
sfr ccapm2=0xdc; //PCA模块2工作模式寄存器
sfr ccapm3=0xdd; //PCA模块3工作模式寄存器
sfr ch=0xf9; //PCA计数器高8位
sfr cl=0xe9; //PCA计数器低8位
sfr ccon=0xd8; //PCA控制寄存器
sfr cmod=0xd9; //PCA工作模式寄存器
sbit cr=ccon^6; //PCA计数器控制位,1开0关
sbit epca_lvd=IE^6; //PCA中断允许控制位1开0关
sfr auxr=0x8E; //定时器工作于1T控制位
//==============================================================================
sbit zb=P1^3;
sbit pwmal=P2^3; //A相下桥驱动定义
sbit pwmbl=P2^2; //B相下桥驱动定义
sbit pwmcl=P2^1; //C相下桥驱动定义
sbit led=P2^7; //指示灯定义
sbit abs=P2^5; //ABS刹车功能选择口,对地为ABS功能
sbit shache=P3^0; //刹车口定义,对地刹车
sbit fd=P3^3; //防盗检测口定义
int ledcs; //定义一个指示灯闪灯次数变量
static fd_hej;
static timebj; //定义一个定时器计数比较变量
static timejs; //定义一个定时器中断计数次数变量
static pwm_bl; //PWM输出变量
static zs_bl=20; //pwm旧的变量数据,备份的
static pwm_bls; //PWM软启动加速用变量
static shache_bz; //刹车后该标志置1供软启动使用
static hehc; //霍尔数据暂存区
static hehc_bl; //上相霍尔数据暂存区,用于检测霍尔变化
static dz_bz; //堵转标志,为1堵转
static dz_bz1;
static zbyx_bz; //转把有效标志,归0时为0,行驶时为1有效
static ds_bf=10; //转把上次的数据备份
static zs_js; //转速数据
static zs_ds_js;
int qy_1,qy_2,qy_3; //欠压测量暂存区1,2,3
int cs1,cs2,cs3,cs_fx; //电机测速全局变量
static qy_bf; //欠压上次的数据备份
int h; //ABS刹车用变量
int dz;
int dz2;
void zb_fx(void);
void he_gzjc(void);
void pwm_out(void);
//*********************AD转换后PWM对照表*****************************************
uchar code pwmout[256]=
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,//60个1为1.3v以下
//------------------------------------------------------------------------------------------
241,239,237,235,233,231,229,227,225,223,221,219,217,215,213,211,209,207,205,203,
201,199,197,195,193,191,189,187,185,183,181,179,177,175,173,171,169,167,165,163,
161,159,157,155,153,151,149,147,145,143,141,139,137,135,133,131,129,127,125,123,//60
121,119,117,115,113,111,109,107,105,103,101,99,97,95,93,91,89,87,85,83,81,79,77,//23
75,73,71,69,67,65,63,61,59,57,55,53,51,49,47,46,45,44,43,42,41,40,39,38,37,36,//26
35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,//26
9,8,7,6,5,4,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,//34 //25个0为4.1--4.5v
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1}; //26个为4.5V以上
//*********************1MS延时函数***********************************************
void delay(int t)
{
int i,j;
for(i=0;i<t;i++)
for(j=0;j<250;j++)
;
}
//*********************ABS刹车延时函数***********************************************
void delay1(int t)
{
int i,j;
for(i=0;i<t;i++)
for(j=adc_data;j>0;j--)
{}
}
//*********************设置AD电源和开漏函数**************************************
adc_power()
{
adc_contr|=0x80; //开AD电源
delay(2); //首次开AD电源要延时1MS左右
p1m0|=0x88; //设置P1.3和P1.7为开漏即AD转换模式
p1m1|=0x88; //同上
}
//-------------------设置P1.3为转把测量通道函------------------------------------
set_p13_adc()
{ zb=1;
adc_contr=0xe3; //P13口为转换通道
}
//-------------------设置P17为电机超载测量通道函数--------------------------------
set_p17_adc()
{
adc_contr=0xe7;
}
//------------------设置P15为欠压检测测量通道-------------------------------------
set_p15_adc()
{adc_contr=0xe5;}
//===================测量电压函数=================================================
get_ad_dy()
{ int adon=0; //定义一个整型变量用于检测AD转换是否结束
adc_data=0; //AD转换结果寄存器清0
adc_contr|=0x08; //转换位置1启动转换
while(adon==0) //循环判断表达式成立反复执行语句,不成立退出
{adon=adc_contr&0x10;} //循环语句体,即判断AD转换是否完成,完成后高第4位为1
adc_contr&=0xe7; //循环语句退出转换完成,清adc_flag,adc_start,停止转换
}
//********************PWM初始化函数***********************************************
pwm_sz()
{
cmod=0x82; //PCA在空闲模式下停止PCA计数器工作
//PCA时钟源为1/2溢出
//禁止PCA计数器溢出中断
ccon=0x00; //禁止PCA计数器工作,清除中断标志和计数器溢出标志
cl=0x00; //清0计数器
ch=0x00;
//======================以下为4路PWM输出设置程序=============================
//设置模块0为8位PWM输出模式,PWM无需中断支持,,脉冲在P3.7口输出
ccapm0=0x42; //***程序核心语句,-----0100,0010
pca_pwm0=0x03; //先关闭PWM-输出为0,写入0x00就可开PWM输出
//设置模块1为8位PWM输出模式,PWM无需中断支持,,脉冲在P3.5口输出
ccapm1=0x42; //***程序核心语句,-----0100,0010
pca_pwm1=0x03; //先关闭PWM-输出为0,写入0x00就可开PWM输出
//设置模块2为8位PWM输出模式,PWM无需中断支持,,脉冲在P2.0口输出
ccapm2=0x42; //***程序核心语句,-----0100,0010
pca_pwm2=0x03; //先关闭PWM-输出为0,写入0x00就可开PWM输出
//模块3未用
epca_lvd=1; //开PCA中断
EA=1; //开总中断
cr=1; //开PCA计数器打开
}
//********************快闪灯函数***********************************************
led_k()
{ int k; //定义一个临时变量
for(k=0;k<ledcs;k++) //表达式2条件不满足即次数未到重复执行循环体语句
{led=0;delay(700);
led=1;delay(700);}
delay(2000);
}
//********************定时器0和1初始化函数*******************************************
time_csh()
{
TMOD=0x11; //定时器0工作于8位自动重装,1工作于方式1
TH0=0x3c; //
TL0=0x0b;
TH1=0x3c; //12MHZ时50MS数据,20次为1S
TL1=0x0b;
IT0=1; //设置外中断0为下降沿触发358第一脚
EX0=1; //开外中断0
EA=1; //开总中断
ET0=1; //开定时期0中断
ET1=1; //开定时期1中断
}
//********************定时器0中断函数PWM频率用************************************
void time0(void)interrupt 1
{TR0=0;TH0=0x3c;TL0=0x0b;
zs_ds_js++;
if(zs_ds_js==10)
{if(zs_js<10)
{dz_bz1=1;zs_ds_js=0;zs_js=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -