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

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;i

for(j=0;j<250;j++)

;

}

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

void delay1(int t)

{

int i,j;

for(i=0;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&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上桥

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

[1] [2] [3]
关键字:mcu-stc12c5404ad  单片机  直流无刷电机  驱动程序 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic513355.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

AT90S8515单片机SPI驱动74LS595源程序
AT90S8515使用SPI驱动74LS595。我这里使用了SS口线PB.4,作为74LS595的锁存信号,关键是把PB.4设置为输出。74LS595驱动发光管显示加1计数,我用SPI最高速度,所以显示16位计数高八位,低八位太快,看不清楚。单片机源程序如下://ICC-AVR application builder : 2020/3/30 22:23:31// Target : 8515// Crystal: 8.0000Mhz#include <io8515v.h>#include <macros.h>#define SS_ON PORTB |= BIT(4);     
发表于 2020-09-16
AT90S8515<font color='red'>单片机</font>SPI驱动74LS595源程序
avr单片机秒表Proteus仿真程序 tm1637数码管显示
单片机源程序如下:/***版权所有(c)2018,艁ukasz Marcin Podkalicki*2009年12月13日            *简单定时器(启动/复位/停止),使用基于TM1637的一个按钮和7段显示模块。              *            *注意,这个ATtiny13项目使用的内部时钟并不精确            
发表于 2020-09-16
avr<font color='red'>单片机</font>秒表Proteus仿真程序 tm1637数码管显示
基于MSP430F149的阻抗测量系统设计
  引 言  医学阻抗测量是利用生物组织与器官的电特性及其变化,提取与生物体生理、病理状况相关的生物医学信息的一种检测技术。它通常借助于驱动电极向检测对象送入一微小的交变电流(或电压)信号,同时测量两极的电压(或电流)信号,从而计算出相应阻抗,然后应用于不同目的。  本设计利用MSP430F149自带的串口通过RS485进行远距离实时传输,上位机可将实时数据进行曲线绘制、数据保存等处理。  1 系统结构  系统采用TI公司的MSP430F149单片机。该单片机有60 KB Flash、2 KB RAM,具有强大的数据处理能力。单片机通过向AD9852发送频率字、幅度字从而控制正弦波的频率、幅度。正弦波经过电流转电压、功率放大等电路
发表于 2020-09-16
基于MSP430F149的阻抗测量系统设计
单片机、ARM、MCU、DSP、FPGA、嵌入式的定义、特征及关系详解
首先,“嵌入式”这是个概念,准确的定义没有,各个书上都有各自的定义。但是主要思想是一样的,就是相比较PC机这种通用系统来说,嵌入式系统是个专用系统,结构精简,在硬件和软件上都只保留需要的部分,而将不需要的部分裁去。所以嵌入式系统一般都具有便携、低功耗、性能单一等特性。然后,MCU、DSP、FPGA这些都属于嵌入式系统的范畴,是为了实现某一目的而使用的工具。MCU 俗称”单片机“经过这么多年的发展,早已不单单只有普林斯顿结构的51了,性能也已得到了很大的提升。因为MCU必须顺序执行程序,所以适于做控制,较多地应用于工业。而ARM本是一家专门设计MCU的公司,由于技术先进加上策略得当,这两年单片机市场份额占有率巨大。ARM
发表于 2020-09-16
51单片机控制+MAX7219+DS1302 电子钟
/***************************************************程序名称:  MAX7219 C语言控制程序                          *程序功能: 3线串行控制8位共阴数码管                       &n
发表于 2020-09-16
基于单片机内部定时器中断计数器设计
电源电路就是单片机的供电电路,一般是3.3V或者5V,具体多少要参考各种型号的单片机的工作电压,通常情况下是5V,这里是指通常情况下。整体设计思路:单片机中断初始化程序应完成du如下工作:1、对TMOD赋值,以确定T0和T1的工作方式。2、计算初值,并将其写入TH0、TL0或TH1、TL1。3、中断方式时,则对IE赋值,开放中断。4、使TR0或TR1置位,启动定时/计数器定时或计数。整体设计思路单片机的中断为向量中断,即一响应中断就转入固定入口地址执行中断服务程序。各中断源服务程序的入口地址两个中断入口间只相隔8字节,难以安放一个完整的中断服务程序。因此,通常在中断入口地址处放置一条无条件转移指令,使程序执行转向中断服务程序入口
发表于 2020-09-16
基于<font color='red'>单片机</font>内部定时器中断计数器设计
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved