1、Mega48做的电动车控制程序/*ROM 3892 BYTES*/*功能*/*60度/120度直流无刷电机自适应*/*软启动*/*转把调速*/*禁止巡航/手动按键巡航/自动巡航*/*过流保护*/*限流*/*堵转保护(堵转进入静音)*/*防飞车保护(上电转把必须归零及防止转把电压出现异常)*/*1+1助力*/*欠压回差保护*/*EABS电子柔性刹车(柔性静音)*/*换相补偿*/*ISP在线编程、维护和升级软件*/*使用最新AT电机专用驱动MCU*/*注:堵转退出不可靠的现象已在该程序解决,使用if(drive_duty_var=0)语句*/*注:该程序没有按键巡航的功能(已屏蔽)*/*注:该程序
2、空载时高速纯使用机械刹车没事*/*注:根据余姚路易要求,堵转电流为12A1A,限流18A1A*/*注:换相时关断MOS管加入了冗余语句close_drive_function()两条,新龙测试时出现的启动复位现象、异常过流现象已基本解决*/*/#include iom48v.h/#include avr/interrupt.h/#include avr/pgmspace.h/*/#define QIANYA_VALUE 120 /欠压值预定义(QIANYA_VALUE/255*5)QIANYA_VALUE=118时,欠压值为41.5V0.5V;QIANYA_VALUE=128时,欠压值为440
3、.5V#define XIANLIU_CURRENT_VALUE 110 /限流值预定义(XIANLIU_VALUE/10A)0XIANLIU_VALUEBcase 0b00000001:TCCR1A=0b00100001;/开CHPORTB&=0b;/开BLbreak; /电流流向:C-Bcase 0b00000010:;case 0b00000111:TCCR0A=0b00100001;/开BHPORTD&=0b;/开ALbreak; /电流流向:B-Acase 0b00000011:TCCR1A=0b00100001;/开CHPORTD&=0b;/开ALbreak; /电流流向:C-Ac
4、ase 0b00000100:TCCR0A=0b;/开AHPORTB&=0b;/开CLbreak; /电流流向:A-Ccase 0b00000110:TCCR0A=0b00100001;/开BHPORTB&=0b;/开CLbreak; /电流流向:B-Cdefault:break;/*/*开三桥函数*/*/void change_phase_function1(void)close_drive_function();close_drive_function();close_drive_function();close_drive_function();close_drive_function(
5、);switch(PIND&0b00000111)case 0b00000000:;case 0b00000101:TCCR0A=0b;TCCR1A=0b00100001;/开AH CHPORTB&=0b;/开BLbreak; /电流流向:A-Bcase 0b00000001:TCCR1A=0b00100001;/开CHPORTD&=0b;/开ALPORTB&=0b;/开BLbreak; /电流流向:C-Bcase 0b00000010:;case 0b00000111:TCCR0A=0b00100001;/开BHPORTB&=0b;/开CLPORTD&=0b;/开ALbreak; /电流流向
6、:B-Acase 0b00000011:TCCR0A=0b00100001;TCCR1A=0b00100001;/开BH CHPORTD&=0b;/开ALbreak; /电流流向:C-Acase 0b00000100:TCCR0A=0b;/开AHPORTB&=0b;/开BL CL/PORTB&=0b;/开CLbreak; /电流流向:A-Ccase 0b00000110:TCCR0A=0b;/开AH BHPORTB&=0b;/开CLbreak; /电流流向:B-Cdefault:break;/*/int main(void)/初始化DDRB=0b00001110;DDRC=0b00010000
7、;DDRD=0b01101000;PORTB=0b;PORTC=0b01101000; PORTD=0b; /各端口初始化/*防飞车保护功能的实现*/feiche_protect:ADMUX=0b00100001; /从1通道转换ADCSRA=0b; /首先128分频,ADC中断禁止ADCSRB=0b00000000; /单步触发转换模式,/8MHZ*128*25(最多时钟数)400usADCSRA|=0b01000000; /启动第一次转换开始while(ADCSRA&0b00010000)=0);ADCSRA|=0b00010000;/向标志写1来将ADC标志清除if(ADCH63)got
8、o feiche_protect;/TIMSK0=0b00000000;TCCR0A=0b00000001;TCCR0B=0b00000001;/OCR0A=0;/OCR0B=0; /定时器0用来做相位修正的PWM输出,初始化为占空比输出0,不引发任何中断/TIMSK1=0b00000000;TCCR1A=0b00000001;TCCR1B=0b00000001;/OCR1AL=0;/OCR1BL=0; /定时器1用来做8位相位修正的PWM输出,初始化为占空比0,不引发任何中断TIMSK2=0b00000001;TCCR2A=0b00000001;TCCR2B=0b00000001; /OCR
9、2A=0;/OCR2B=0; /定时器2用来做相位修正的PWM输出,初始化占空比为0,并引发定时中断,不分频ADMUX=0b00100000; /首先从通道开始转换ADCSRA=0b; /4分频,开ADC中断使能ADCSRB=0b00000000; /单步触发转换模式,/8MHZ*4*25(最多时钟数)12.5usADCSRA|=0b01000000; /启动第一次转换开始PCICR=0b00000100;PCMSK2=0b0000111; /使能PCINT16,PCINT17和PCINT18的引脚电平变化中断,以捕获霍尔信号SREG|=0b; /开总中断/主循环开始 while(1);/*/
10、*霍尔信号电平变化中断*/*/SIGNAL(SIG_PIN_CHANGE2) PORTC=0b00010000;/霍尔信号变化,则工作指示灯不断闪/*/*ADC转换中断*/*/SIGNAL(SIG_ADC)unsigned char m;switch(adc_int_event_counter)case 0:dianchi_ADC_buffer=ADCH;adc_int_event_counter=1;ADMUX=0b00100001;break;case 1:if(zhuanba_ADC_buffer=ADCH)m=zhuanba_ADC_buffer-ADCH;else m=ADCH-zh
11、uanba_ADC_buffer;if(m=5) /转把回差电压(0.1V)zhuanba_ADC_buffer=ADCH; /只有转把回差电压大于0.1V,才更新转把xunhang_counter=0;adc_int_event_counter=2; ADMUX=0b00100010;break;case 2:xianliu_ADC_buffer=ADCH;adc_int_event_counter=0;ADMUX=0b00100000;break;default:break;ADCSRA|=0b01000000; /启动一次转换开始/*/*定时器2定时中断,约每64uS定时中断一次*/*/
12、SIGNAL(SIG_OVERFLOW2)/*过流保护的实现*/if(flag&0b)=0) /如果还没有过流if(PIND&0b)=0)if(+guoliu_sample_counter=2)flag|=0b; /过流标志置1elseguoliu_sample_counter=0;else /如果已经过流if(zhuanba_ADC_bufferxianliu_var)flag|=0b00001000;else flag&=0b; /超过限流比较值,则超限流标志置1,否则清0/*调速及EABS刹车的实现*/switch(tiaosu_event_counter)case 0:if(flag&
13、0b01000000)=0) / 如果不是刹车if(flag&0b00000010)=0) /如果不是巡航drive_duty_buffer=pgm_read_byte(zhuanba_tab+zhuanba_ADC_buffer);if(flag&0b00000100)!=0)|(flag&0b00010000)!=0)/如果是电池欠压或者堵转drive_duty_buffer=0;if(flag&0b)!=0)drive_duty_var=0; /如果是过流,则立即关闭PWM(无缓冲) drive_duty_buffer=0;if(flag&0b00001000)=0) /如果不是超限流if(+dri