mcu-stc12c5404ad单片机直流无刷电机驱动程序

发布者:BlissfulHiker最新更新时间:2020-10-16 来源: 51hei关键字:mcu-stc12c5404ad  单片机  直流无刷电机  驱动程序 手机看文章 扫描二维码
随时随地手机看文章

//*****************************************************//* ***无刷电机控制器程序*** *//*===================================================* //* MCU-STC12C5404...


//*****************************************************

//* ***无刷电机控制器程序*** *

//*===================================================*

//* mcu-stc12c5404ad 8路ad转换,4路pwm输出,速度1t *

//*===================================================*

//*****************************************************

#include //包含文件预处理命令

#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;ifor(j=0;j<250;j++)

;

}

//*********************abs刹车延时函数***********************************************

void delay1(int t)

{

int i,j;

for(i=0;ifor(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&amt;0x10;} //循环语句体,即判断ad转换是否完成,完成后高第4位为1

adc_contr&amt;=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{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;

th1=0x3c;tl1=0x0b;tr1=1;

th0=0x3c;tl0=0x0b;tr0=1;

// pwm_bls=200;

}

else

{dz_bz1=0;zs_ds_js=0;zs_js=0;zs_bl=zs_js;

th1=0x3c;tl1=0x0b;tr1=0;

th0=0x3c;tl0=0x0b;tr0=1;

}

}

else

{tr0=1;}

}

//********************定时器1中断函数*********************************************

void time1(void)interrupt 3

{ tr1=0;th1=0x3c;tl1=0x0b;

timejs++;

if(timejs==12) //中断次数等于给定的次数就取反led

{if(zbyx_bz==0) //转把归0标志为0,可以闪灯

{led=~led;timejs=0;tr1=1;}

}

if(timejs==80)

{if(dz_bz1==1)

{tr0=0;dz_bz1=0;dz_bz=1;zs_ds_js=0;zs_js=0;timejs=0;}

else

{dz_bz=0;zs_ds_js=0;zs_js=0;timejs=0;}

}

tr1=1;

}

//*******************电机堵转转函数***********************************************

//根据2s定时内一直堵转的话置dz_bz为1,本函数检测到该标志为1立即关闭所有输出

//并闪烁指示灯间隔快闪2次提示,最后监控转把归0后可以退出本函数重新启动

void dgdz(void)

{

while(dz_bz1==1)

{pwm_bls=100;he_gzjc();pwm_out();

if(dz_bz==1)

{ tr0=0;tr1=0;

pca_pwm0=0x03; //关3路pwm信号

pca_pwm1=0x03; //

pca_pwm2=0x03; //

pwmal=0;pwmbl=0;pwmcl=0; //关3路下桥

set_p13_adc(); //电机进入保护后开始等待转把归零后可以重新启动

do{ledcs=2;led_k();get_ad_dy();} //间隔开闪2次提示堵转保护,测量转把电压是否归0

while(adc_data>=61); //没有归0执行do循环体语句

led=1;dz_bz=0;dz_bz1=0; //转把归0后关指示灯清堵转标志

}

}

}

//********************外中断0函数限流或康铜开路************************************

void intt0()interrupt 0

{

tr0=0;tr1=0; //关pwm频率

pca_pwm0=0x03; //关3路pwm信号

pca_pwm1=0x03; //

pca_pwm2=0x03; //

pwmal=0;pwmbl=0;pwmcl=0; //关3路下桥

set_p13_adc();

get_ad_dy();

while(adc_data>=61)

{ledcs=4;led=0;get_ad_dy();}

led=1;

}

//********************pwm驱动桥驱动输出函数****************************************

void pwm_out(void) //入口:pwm_bl里有转把调速参数.出口:输出全桥驱动信号

{

switch(hehc) //多分支语句根据霍尔位置输出对应节拍

{case 0x01:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;

ccap0h=pwm_bls;pwmcl=1;pca_pwm0=0x00;cs1=0x01;break;} //第1拍ccap0h刷新参数开c下桥a上桥

//-------------------------------------------------------------

case 0x03:{pca_pwm0=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;

ccap1h=pwm_bls;pwmcl=1;pca_pwm1=0x00;cs2=0x03;break;} //第2拍ccap1h刷新参数开c下桥b上桥

//-------------------------------------------------------------

case 0x02:{pca_pwm0=0x03;pca_pwm2=0x03;pwmbl=0;pwmcl=0;

ccap1h=pwm_bls;pwmal=1;pca_pwm1=0x00;cs3=0x02;break;} //第3拍ccap1h刷新参数开a下桥b上桥

//-------------------------------------------------------------

case 0x06:{pca_pwm0=0x03;pca_pwm1=0x03;pwmbl=0;pwmcl=0;

ccap2h=pwm_bls;pwmal=1;pca_pwm2=0x00;cs1=0x06;break;} //第4拍ccap2h刷新参数开a下桥c上桥

//-------------------------------------------------------------

case 0x04:{pca_pwm0=0x03;pca_pwm1=0x03;pwmal=0;pwmcl=0;

ccap2h=pwm_bls;pwmbl=1;pca_pwm2=0x00;cs2=0x04;break;} //第5拍ccap2h刷新参数开b下桥c上桥

//-------------------------------------------------------------

case 0x05:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmcl=0;

ccap0h=pwm_bls;pwmbl=1;pca_pwm0=0x00;cs3=0x05;break;} //第6拍ccap0h刷新参数开b下桥a上桥

}

}

//********************上电初始化函数**********************************************

void sd_csh(void)

{p1=0xff;zb=0;p2=0xff;p3=0xff;

pwmal=0; //上电复位后首先关闭3组下桥

pwmbl=0; //

pwmcl=0; //

adc_power(); //调ad转换用初始化函数

pwm_sz(); //调pwm输出用初始化函数

time_csh(); //调两个定时器初始化函数

}

//********************上电防飞车函数归0后led正常闪烁******************************

void sd_ffc(void)

{

set_p13_adc(); //调转把电压转换通道

get_ad_dy(); //上电后测量转把电压是否归零

while(adc_data>=61) //61为1.2v转换值转把如果大于1.2v执行循环体语句等待归0

{ledcs=2;led_k(); //循环体语句,2次间隔性快闪灯

get_ad_dy(); //循环体语句,重新检测电压等待归0

}

tr0=0; //关pwm频率否则干扰闪灯

timebj=12; //归0后定时器中断10次闪烁一次led

tr1=1; //归0后开定时器1-led闪烁

}

//*************刹车函数自动选择是断电还是abs刹车功***************************

void sc_stop(void) //abs刹车有外接口对地选择,对地时为abs功能

{

if(shache==0) //判断语句刹车口等于0执行大语句1

{ abs=1;

//大语句体1

if(abs==1) //判断abs选择不为0就执行普通刹车断电,否则执行abs刹车

//==========普通刹车断电==================================================

{

tr0=0;led=0; //关测速定时器,亮刹车灯

pca_pwm0=0x03; //关3路pwm信号ah

pca_pwm1=0x03; //关3路pwm信号bh

pca_pwm2=0x03; //关3路pwm信号ch

pwmal=0;pwmbl=0;pwmcl=0; //关3路下桥

//----------------------------------------------------------------------

while(shache==0) //循环语句,刹车口没松开就一直等待

{delay(500);} //语句体,延时抗干扰防止抖动

hehc_bl=0;led=1; //刹车口松开后清霍尔变量内存再关刹车灯

//----------------------------------------------------------------------

for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--) //以下两句为刹车口松开后减缓冲击

{he_gzjc();pwm_out();} //从最低速度加高到实时的转把设定速度

}

//===========eabs刹车断电=====================================================

else //abs功能已选择进入abs刹车

{ //

tr0=0;led=0; //关测速定时器,亮刹车灯

pca_pwm0=0x03; //关3路pwm信号ah

pca_pwm1=0x03; //关3路pwm信号bh

pca_pwm2=0x03; //关3路pwm信号ch

pwmal=0;pwmbl=0;pwmcl=0; //关闭3个下桥:al-bl-cl

//-------------------------------------------------------------------------

[1] [2]
关键字:mcu-stc12c5404ad  单片机  直流无刷电机  驱动程序 引用地址:mcu-stc12c5404ad单片机直流无刷电机驱动程序

上一篇:GY-30数字光强度模块BH1750FV
下一篇:stc89c51+ esp8266-01发微信消息,POST例程

推荐阅读最新更新时间:2024-11-07 12:26

基于MCS-51单片机I2C总线接口电路的设计
I2C总线是由串行数据线SDA和串行时钟线SCL构成的,可发送和接收数据。它允许若干兼容器件共享总线。所有挂接在I2C总线上的器件和接口电路都应具有I2C总线接口,且所有的SDA/SCL同名端相连。总线上所有器件要依靠SDA发送的地址信号寻址,不需要片选线。 I2C总线最主要的优点是其简单性和有效性。占用的空间小,降低了互连成本。总线的长度可高达7.6m,并且能够以10kbps的最大传输速率支持40个组件。支持多主控器件,其中,任何能够进行发送和接收的设备都可以成为主器件。主控能够控制信号的传输和时钟频率。当然,在某时刻只能有一个主控器件。 在单片机控制系统中,广泛使用I2C器件。如果单片机自带I2C总线接口,则所有I2C
[单片机]
基于MCS-51<font color='red'>单片机</font>I2C总线接口电路的设计
提高PIC16C711单片机片内A/D分辨率方法
      摘要: 介绍一种将PIC16C711片内8位A/D提高到11位的方法。此方法电路简单,速度快,可提高单片机应用系统的性能价格比,具有一定的推广价值。    关键词: PIC16C711 单片机 A/D 分辨率   目前,单片机中嵌入的A/D一般为8位到10位,难以满足信号处理应用中高分辨率的要求;而外接高分辨率的A/D将使成本明显提高,因为A/D转换器的价格将随其位数的增加而成倍增加。本文介绍一种提高PIC16C711单片机片内A/D分辨率的方法,将PIC16C711片内的8位A/D提高到11位。这种方法在PIC系列的其他单片机也适用。   美国Microchip公司推出的8位单片机PIC16C711是一种性能
[单片机]
提高PIC16C711<font color='red'>单片机</font>片内A/D分辨率方法
MCU控制的TOPSwitch?FZ单片开关电源电路图
由MCU控制的TOPSwitch?FZ单片开关电源电路图 由MCU控制的TOPSwitch?FZ单片开关电源电路图 利用微控制器可对由TOPSwitch?FX构成的喷墨打印机、激光打印机等计算机外部设备中的开关电源进行控制,电路如图5所示。开关电源部分主要由TOPSwitch?FX(IC1)、光耦合器(IC2)组成。控制电路则包括微控制器(MCU)、两片LTV817A线性光耦合器(IC3、IC4)、按钮开关SB。仅当按下SB时产生的信号才有效,抬起时信号不起作用。SB上不需要加防抖动电路,这是因为开关电源的软起动时间(约10ms)和MCU的复位及初始化时间能起到延迟作用,可以避开按下SB时产生抖动干扰的时间;并且仅当开
[电源管理]
由<font color='red'>MCU</font>控制的TOPSwitch?FZ单片开关电源电路图
基于PICC 编译环境编写PIC单片机程序
目前,Microchip 公司生产的PIC系列单片机以其低成本、低功耗、高性能、开发速 度快且一次性用户可编程等优点迅速占领了国内市场,成为国内销售量最大的单片机,但国内介绍他的C语言开发工具的书籍和文章却比较少,而且用的人也不多,在用其开发的过程 中给广大程序员带来了许多困难和不便。 Microchip 公司自己没有针对中低档系列PIC单片机的C 语言编译器,但很多专业的 第三方 公司有众多支持PIC 单片机的C 语言编译器提供,常见的有Hitech,CCS,IAR,Bytecraft 等公司。Hitech 公司的PICC 编译器稳定可靠,编译生成的代码效率高,在用PIC 单片 机进行系统设计和开发的工程师群体中得到广
[单片机]
基于PICC 编译环境编写PIC<font color='red'>单片机</font>程序
如何写出高效优美的单片机C语言代码?
程序 能跑起来并不见得你的代码就是很好的c代码了,衡量代码的好坏应该从以下几个方面来看 1,代码稳定,没有隐患。 2,执行效率高。 3,可读性高。 4,便于移植。 下面发一些我在网上看到的技巧和自己的一些经验来和大家分享; 1、如果可以的话少用库函数,便于不同的mcu和编译器间的移植 2、选择合适的算法和数据结构 应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍。将比较慢的顺序查找法用较快的二分查找或乱 序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都可以大大提高程序执行的效率。.选择一种合适的数据结构也很重要,比如你在一堆 随机存放的数中使用了大
[单片机]
基于单片机的智能温度监测系统设计
智能温度检测系统是通过硬件电路设计和软件编程驱动的结合方式,实现0℃~99℃范围内的温度智能监测。可通过LCD实时显示实际温度和预设温度,当温度超出预设范围时及时报警,而且报警声用电子乐曲或音乐音符实现。 前言 本次设计的主要思路是利用51系列单片机,数字温度传感器DS18B20和1602LCD液晶显示,构成实现温度检测与显示的单片机控制系统,即数字温度计。通过对单片机编写相应的程序,达到能够实时检测周围温度的目的。 通过对本课题的设计能够熟悉数字温度计的工作原理及过程,了解各功能器件(单片机、DS18B20、LCD)的基本原理与应用,掌握各部分电路的硬件连线与程序编写,最终完成对数字温度计的总体设计。其具体的要求如下: 1、
[单片机]
基于<font color='red'>单片机</font>的智能温度监测系统设计
飞思卡尔推出业界最强大的汽车动力总成系统微控制器
2011年10月12日 - 德国巴登(2011汽车电子系统展览会) – 汽车厂商继续通过新的汽车设计将业界标准提升至新高度,通过交付具有更高燃油经济性和更低排放的汽车满足消费者的期望和政府的法规要求。高性能微控制器(MCU)在环保汽车设计领域扮演着重要角色,飞思卡尔半导体(NYSE:FSL)日前宣布推出强大的多核心汽车MCU系列中的第一款产品,帮助汽车设计者更加轻松地提高引擎效率并降低排放污染。   飞思卡尔新推出的多核心Qorivva 32位MPC5676R MCU在Power Architecture® 技术的基础上构建,与上一代单核心MPC5566 MCU相比,性能提高了四倍、内存空间提高了一倍、并提供了更多功能。MPC56
[电源管理]
基于51单片机的霍尔水流量计设计
1、开发准备 (1)YF-B1流量传感器一个 (2)51开发板一个 2、基础知识 (1)YF-B1流量传感器只有三根线。即数据线、VCC、GND。数据线输出为占空比为50%的方波。当水流通过水流转子组件时,磁性转子转动并且转速随着流量的变化而成线性变化。霍尔传感器(霍尔元件采样)输出相应的脉冲信号。其流量脉冲特性计算公式为:脉冲f(Hz)=8.1x流量Q(L/min)-3。 (2)51单片机的中断工作方式。51单片机有定时器T0和T1,他们既有定时又有计数的功能。通过设置相关的特殊功能寄存器就可以启用定时或计数功能。需要注意的是,定时器系统是单片机内部一个独立的硬件部分,CPU一旦设置定时功能,定时器便在晶振的作用下计时
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved