无刷直流电机控制器设计程序
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ key=get_char(); switch (key)
{ case 'A': n_ref_key=atoi(str);TIMER1_CONTROL=1;break; case 'B': n_ref_select_flag=~n_ref_select_flag;break;//切换 case 'C': pwm_positive=10000;pwm_negtive=10000;n_ref_key=3000;
set_refled_buf('0',0,4);set_fdbled_buf('0',0,4); TIMER1_CONTROL=0;break;//停止,关转速调节定时器 case '0': get_str(str,4);break; default: ; } } else return; } /*判断是否有键按下函数*/ bit kbd_hit(void) { key_row=0x00;//往键盘行输出 0 if ((key_col&0xff)==0xff)//检测列线 return((bit)0); delay(8);//延时 8ms 消抖 if ((key_col&0xff)==0xff)//再次检测确认 return((bit)0); else return((bit)1); } /*等待按键函数*/ unsigned char get_char(void) { unsigned char row=0,col=0;
ET1=0;//关转速调节中断 ET2=0;//关测速计数器溢出中断 EX0=0;//关 INT0 中断 IT0=1;//INT0 负边沿触发; IT1=1;//INT1 负边沿触发; set_refled_buf('0',0,4); set_fdbled_buf('0',0,4); LastError=0; //Error[-1] Proportion=0.000001; //比例常数 Proportional Const Integral=0.00001; //积分常数 Integral Const pwm_lou=0.5; str[0]='3';str[1]='0';str[2]='0';str[3]='0'; ET1=1;//开转速调节中断 } /*段码查找函数*/ unsigned char get_strokes(unsigned char c) { unsigned char i=0; while (led_strokes[i].ascii!=c) i++; return (led_strokes[i].stroke); } /*将当前给定显示缓冲区字符显示到 LED 上*/ void put_on_refleds(void) { unsigned char pos; unsigned char ledbit=0xfe; for (pos=0;pos<4;pos++)
{ led_bit=ledbit; led_data=get_strokes(fdbled_buf[pos]); delay(1);//延时 1ms
ledbit=_crol_(ledbit,1); } } /*若有键按下,对相应命令进行解释并转相应处理子程序*/ void key_monitor(void) { unsigned char key; if (kbd_hit())
{ led_bit=ledbit; led_data=get_strokes(refled_buf[pos]); delay(1);//延时 1ms ledbit=_crol_(ledbit,1);
} } /*将当前转速反馈显示缓冲区字符显示到 LED 上*/ void put_on_fdbleds(void) { unsigned char pos; unsigned char ledbit=0xef; for (pos=0;pos<4;pos++)
unsigned int n_test(void); unsigned int i_a_test(void); unsigned read_nref(void); extern void delay(int);1 sfr AUXR=0x8e; sbit PWM_OUT=P1^6; /*PWM 信号输出位*/ bit n_ref_select_flag=0;//给定选择标识位 unsigned int n_feedback=0; unsigned int n_ref=0; unsigned int pwm_positive;//脉宽范围 0~65536us,定时器 0 工作在方式 1 unsigned int pwm_negtive; float pwm_lou;//PWM 占空比 unsigned int n_ref_key; unsigned int n_ref_pot; unsigned int motor_i_a; unsigned char refled_buf[4]; unsigned char fdbled_buf[4]; unsigned char str[4]; main() {
#include <regx52.h> #include <absacc.h> #include <stdlib.h> #include <string.h> #include <intrins.h> #include <ctype.h> #define led_bit XBYTE[0x88ff] /*LED 寻位地址*/ #define led_data XBYTE[0x09ff] /*LED 数据地址*/ #define key_row XBYTE[0x0Aff] /*键盘行地址*/ #define key_col XBYTE[0x0Cff] /*键盘列地址*/ #define TIMER0_CONTROL TR0 /*定时器 0 控制位*/ #define TIMER1_CONTROL TR1 /*定时器 1 控制位*/ #define TIMER2_CONTROL TR2 /*定时器 2 控制位*/ #define i_a_limit 0x0D /*电枢限流 0.5A*/ /*定义共阳极 LED 显示段码*/ static struct {char ascii;char stroke;} code led_strokes[27]={ {'0',0xc0},{'1',0xf9},{'2',0xa4},{'3',0xb0},{'4',0x99},{'5',0x92}, {'6',0x82},{'7',0xf8},{'8',0x80},{'9',0x90},{'A',0x88},{'b',0x83}, {'c',0xc6},{'d',0xa1},{'E',0x86},{'F',0x8e},{'.',0x7f},{'P',0x8c}, {'U',0xc1},{'T',0xce},{'y',0x91},{'o',0xa3},{'-',0xbf},{'=',0xb7}, {'r',0xaf},{0x00,0x00},{0xff,0xff} }; /*定义 PI 控制器参数*/
TIMER1_CONTROL=1;break;//启动,开转速调节定时器 case 'D': n_ref_select_flag=0;n_ref_key+=100;break;//加速 case 'E': n_ref_select_flag=0;n_ref_key-=100;break;//减速 case 'F': pwm_positive=10000;pwm_negtive=10000;n_ref_key=0;
unsigned char key_value; unsigned char scan_rowbyrow=0xfe; /*分析按键行号*/ key_row=scan_rowbyrow; while ((key_col&0xff)==0xff&&scan_rowbyrow>0xef)
{ ++row; scan_rowbyrow=_crol_(scan_rowbyrow,1); key_row=scan_rowbyrow; } /*分析按键列号*/ key_value=key_col&0xff; scan_rowbyrow=0x01; while (key_value&scan_rowbyrow) { ++col; scan_rowbyrow=_crol_(scan_rowbyrow,1); } /*等按键释放*/ while ((key_col&0xff)!=0xff); delay(8);//延时 8ms 消抖 if ((key_col&0xff)==0xff)//再次检测确认 { key_row=0xff; /*计算按键值*/ key_value=row*4+col; if (key_value<9) key_value+='0'+1; else if (key_value==9) key_value='0'; else key_value+='A'-10; } return(key_value); } /*取键盘字符串函数*/ unsigned char *get_str(unsigned char *str,unsigned int len) { unsigned char i; unsigned char ch; unsigned char keyboard_buf[4];//键盘缓冲区 unsigned char keybuf_pos=0; TIMER1_CONTROL=0; set_refled_buf('0',0,4);
init_system(); while(1) {
key_monitor(); put_on_refleds(); put_on_fdbleds(); } } /*系统初始化函数*/ void init_system(void) { AUXR=0xff; TMOD=0x11;//T0,T1 均工作在方式 1 T2CON=0x03;//T2 工作方式:计数器,捕获 pwm_positive=pwm_negtive=25000;//PWM 占空比初始值 0.5 TH0=(65536-pwm_positive)/256;//T0Байду номын сангаас的计数初始值 TL0=(65536-pwm_positive)%256;// EA=1;//开所有中断 ET0=1;//开 PWM 输出中断 TR0=1;//开 PWM 输出定时器 IP=0x0a;//设置中断优先级 T0,T1 高优先级 TH1=(65536-10000)/256;//T1 的计数初始值 10ms TL1=(65536-10000)%256; TR1=0;//关转速调节定时器
float Proportion; //比例常数 Proportional Const float Integral; //积分常数 Integral Const float Derivative; //微分常数 Derivative Const int LastError; //E[k-1] int PrrevError;//E[k-2] /*定义全局函数和变量*/ void init_system(void); void key_monitor(void); void set_refled_buf(unsigned char a,int pos,int len); void put_on_refleds(void); void set_fdbled_buf(unsigned char a,int pos,int len); void put_on_fdbleds(void); void asr_pid(unsigned int na,unsigned int nb); bit kbd_hit(void); unsigned char get_char(void); unsigned char *get_str(unsigned char *str,unsigned int len); unsigned char get_strokes(unsigned char c); void adc0804_start(void); unsigned int adc0804_read(void);
{ case 'A': n_ref_key=atoi(str);TIMER1_CONTROL=1;break; case 'B': n_ref_select_flag=~n_ref_select_flag;break;//切换 case 'C': pwm_positive=10000;pwm_negtive=10000;n_ref_key=3000;
set_refled_buf('0',0,4);set_fdbled_buf('0',0,4); TIMER1_CONTROL=0;break;//停止,关转速调节定时器 case '0': get_str(str,4);break; default: ; } } else return; } /*判断是否有键按下函数*/ bit kbd_hit(void) { key_row=0x00;//往键盘行输出 0 if ((key_col&0xff)==0xff)//检测列线 return((bit)0); delay(8);//延时 8ms 消抖 if ((key_col&0xff)==0xff)//再次检测确认 return((bit)0); else return((bit)1); } /*等待按键函数*/ unsigned char get_char(void) { unsigned char row=0,col=0;
ET1=0;//关转速调节中断 ET2=0;//关测速计数器溢出中断 EX0=0;//关 INT0 中断 IT0=1;//INT0 负边沿触发; IT1=1;//INT1 负边沿触发; set_refled_buf('0',0,4); set_fdbled_buf('0',0,4); LastError=0; //Error[-1] Proportion=0.000001; //比例常数 Proportional Const Integral=0.00001; //积分常数 Integral Const pwm_lou=0.5; str[0]='3';str[1]='0';str[2]='0';str[3]='0'; ET1=1;//开转速调节中断 } /*段码查找函数*/ unsigned char get_strokes(unsigned char c) { unsigned char i=0; while (led_strokes[i].ascii!=c) i++; return (led_strokes[i].stroke); } /*将当前给定显示缓冲区字符显示到 LED 上*/ void put_on_refleds(void) { unsigned char pos; unsigned char ledbit=0xfe; for (pos=0;pos<4;pos++)
{ led_bit=ledbit; led_data=get_strokes(fdbled_buf[pos]); delay(1);//延时 1ms
ledbit=_crol_(ledbit,1); } } /*若有键按下,对相应命令进行解释并转相应处理子程序*/ void key_monitor(void) { unsigned char key; if (kbd_hit())
{ led_bit=ledbit; led_data=get_strokes(refled_buf[pos]); delay(1);//延时 1ms ledbit=_crol_(ledbit,1);
} } /*将当前转速反馈显示缓冲区字符显示到 LED 上*/ void put_on_fdbleds(void) { unsigned char pos; unsigned char ledbit=0xef; for (pos=0;pos<4;pos++)
unsigned int n_test(void); unsigned int i_a_test(void); unsigned read_nref(void); extern void delay(int);1 sfr AUXR=0x8e; sbit PWM_OUT=P1^6; /*PWM 信号输出位*/ bit n_ref_select_flag=0;//给定选择标识位 unsigned int n_feedback=0; unsigned int n_ref=0; unsigned int pwm_positive;//脉宽范围 0~65536us,定时器 0 工作在方式 1 unsigned int pwm_negtive; float pwm_lou;//PWM 占空比 unsigned int n_ref_key; unsigned int n_ref_pot; unsigned int motor_i_a; unsigned char refled_buf[4]; unsigned char fdbled_buf[4]; unsigned char str[4]; main() {
#include <regx52.h> #include <absacc.h> #include <stdlib.h> #include <string.h> #include <intrins.h> #include <ctype.h> #define led_bit XBYTE[0x88ff] /*LED 寻位地址*/ #define led_data XBYTE[0x09ff] /*LED 数据地址*/ #define key_row XBYTE[0x0Aff] /*键盘行地址*/ #define key_col XBYTE[0x0Cff] /*键盘列地址*/ #define TIMER0_CONTROL TR0 /*定时器 0 控制位*/ #define TIMER1_CONTROL TR1 /*定时器 1 控制位*/ #define TIMER2_CONTROL TR2 /*定时器 2 控制位*/ #define i_a_limit 0x0D /*电枢限流 0.5A*/ /*定义共阳极 LED 显示段码*/ static struct {char ascii;char stroke;} code led_strokes[27]={ {'0',0xc0},{'1',0xf9},{'2',0xa4},{'3',0xb0},{'4',0x99},{'5',0x92}, {'6',0x82},{'7',0xf8},{'8',0x80},{'9',0x90},{'A',0x88},{'b',0x83}, {'c',0xc6},{'d',0xa1},{'E',0x86},{'F',0x8e},{'.',0x7f},{'P',0x8c}, {'U',0xc1},{'T',0xce},{'y',0x91},{'o',0xa3},{'-',0xbf},{'=',0xb7}, {'r',0xaf},{0x00,0x00},{0xff,0xff} }; /*定义 PI 控制器参数*/
TIMER1_CONTROL=1;break;//启动,开转速调节定时器 case 'D': n_ref_select_flag=0;n_ref_key+=100;break;//加速 case 'E': n_ref_select_flag=0;n_ref_key-=100;break;//减速 case 'F': pwm_positive=10000;pwm_negtive=10000;n_ref_key=0;
unsigned char key_value; unsigned char scan_rowbyrow=0xfe; /*分析按键行号*/ key_row=scan_rowbyrow; while ((key_col&0xff)==0xff&&scan_rowbyrow>0xef)
{ ++row; scan_rowbyrow=_crol_(scan_rowbyrow,1); key_row=scan_rowbyrow; } /*分析按键列号*/ key_value=key_col&0xff; scan_rowbyrow=0x01; while (key_value&scan_rowbyrow) { ++col; scan_rowbyrow=_crol_(scan_rowbyrow,1); } /*等按键释放*/ while ((key_col&0xff)!=0xff); delay(8);//延时 8ms 消抖 if ((key_col&0xff)==0xff)//再次检测确认 { key_row=0xff; /*计算按键值*/ key_value=row*4+col; if (key_value<9) key_value+='0'+1; else if (key_value==9) key_value='0'; else key_value+='A'-10; } return(key_value); } /*取键盘字符串函数*/ unsigned char *get_str(unsigned char *str,unsigned int len) { unsigned char i; unsigned char ch; unsigned char keyboard_buf[4];//键盘缓冲区 unsigned char keybuf_pos=0; TIMER1_CONTROL=0; set_refled_buf('0',0,4);
init_system(); while(1) {
key_monitor(); put_on_refleds(); put_on_fdbleds(); } } /*系统初始化函数*/ void init_system(void) { AUXR=0xff; TMOD=0x11;//T0,T1 均工作在方式 1 T2CON=0x03;//T2 工作方式:计数器,捕获 pwm_positive=pwm_negtive=25000;//PWM 占空比初始值 0.5 TH0=(65536-pwm_positive)/256;//T0Байду номын сангаас的计数初始值 TL0=(65536-pwm_positive)%256;// EA=1;//开所有中断 ET0=1;//开 PWM 输出中断 TR0=1;//开 PWM 输出定时器 IP=0x0a;//设置中断优先级 T0,T1 高优先级 TH1=(65536-10000)/256;//T1 的计数初始值 10ms TL1=(65536-10000)%256; TR1=0;//关转速调节定时器
float Proportion; //比例常数 Proportional Const float Integral; //积分常数 Integral Const float Derivative; //微分常数 Derivative Const int LastError; //E[k-1] int PrrevError;//E[k-2] /*定义全局函数和变量*/ void init_system(void); void key_monitor(void); void set_refled_buf(unsigned char a,int pos,int len); void put_on_refleds(void); void set_fdbled_buf(unsigned char a,int pos,int len); void put_on_fdbleds(void); void asr_pid(unsigned int na,unsigned int nb); bit kbd_hit(void); unsigned char get_char(void); unsigned char *get_str(unsigned char *str,unsigned int len); unsigned char get_strokes(unsigned char c); void adc0804_start(void); unsigned int adc0804_read(void);