x
A题-报告1-程序清单 | ||||
| ||||
A题-报告1-程序清单 源程序//*************************************************************************** // ADC[1] I1 // ADC[2] U1 // ADC[3] U2 //*************************************************************************** #include"msp430.h" #include<stdint.h> #include"LCD12864.h" #include<stdlib.h> #include"mystdlib.h" #include"variables.h" #include"Init.h" #include"MyMath.h"
#define IR2110_ON P8OUT &= ~BIT1 #define IR2110_OFF P8OUT |= BIT1 #define BUCK_CCR TBCCR1 #define BOOST_CCR TBCCR2
voidLCD_display(); voidKey_response(int key_val);
double ADC_remainder = 0,*p_remainder=0; int key_read_mark=0; int LCD_display_mark=0; int Is_running = 0; int AD_display = 0;//0:not play; 1:display; int LCD_init_mark = 0;
int mode_open_loop = 0, mode_current_closed_loop = 1, mode_voltage_closed_loop = 2, mode_debug = 20, mode_overcurrent_protection = 30; int mode = 0; int X_set_mode = 1;//mode_current_closed_loop int I_set = 100;//200/100=2.0 int U_set = 300; int current_ring_width = 0; int error_count = 0;
intmain(void) { WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer while (REFCTL0 & REFGENBUSY); REFCTL0 |= REFVSEL_2 + REFON; UCS_init(); Port_init(); Data_init(); key_init(); ADC_init(); LCD12864_initial(); LCD12864_clear(); dma_init(); Timer_A0_init(); Timer_A1_init(); Timer_A2_init(); Timer_B0_init(); __enable_interrupt(); tb0.pwm1_ccr = TBCCR0 * 0.65; tb0.pwm2_ccr = tb0.pwm1_ccr + tb0.dead_time; tb1_count = 0; set_tb_buf(tb0.pwm1_ccr, tb1_count);
IR2110_ON;
while (1){ if (key_read_mark){ key_read(); key_read_mark = 0; Key_response(key_val); //LCD_display_mark = 1; } if (LCD_display_mark){ if(LCD_init_mark){ } LCD_display_mark = 0; LCD_display(); } if (ADC_buf_full_mark){ ADC_buf_full_mark = 0;
ADC[1].buf_2nd[ADC_buf_2nd_index] = Median_filter(ADC[1].buf[1-ADC_buf_1st_turn], ADC_BUF_1st_LEN, &ADC_remainder); ADC[1].remainder_1st += ADC_remainder;
ADC[2].buf_2nd[ADC_buf_2nd_index] = Median_filter(ADC[2].buf[1-ADC_buf_1st_turn], ADC_BUF_1st_LEN, &ADC_remainder); ADC[2].remainder_1st += ADC_remainder;
ADC[3].buf_2nd[ADC_buf_2nd_index] = Median_filter(ADC[3].buf[1-ADC_buf_1st_turn], ADC_BUF_1st_LEN, &ADC_remainder); ADC_buf_2nd_index++;
if (ADC_buf_2nd_index == ADC_BUF_2nd_LEN) { ADC_buf_2nd_index = 0; ADC[1].read_double = 0.3 * ADC[1].read_double + 0.7 * (ADC[1].remainder_1st / ADC_BUF_2nd_LEN + Mean(ADC[1].buf_2nd, ADC_BUF_2nd_LEN, &ADC_remainder)); ADC[1].read_double += ADC_remainder * 0.7; ADC[1].remainder_1st = 0; ADC[1].read = ADC[1].read_double;
ADC[2].read_double = (ADC[2].read_double + ADC[2].remainder_1st / ADC_BUF_2nd_LEN + Mean(ADC[2].buf_2nd, ADC_BUF_2nd_LEN, &ADC_remainder)) / 2; ADC[2].read_double += ADC_remainder / 2; ADC[2].remainder_1st = 0; ADC[2].read = ADC[2].read_double; ADC[3].read_double = (ADC[3].read_double + ADC[3].remainder_1st / ADC_BUF_2nd_LEN + Mean(ADC[3].buf_2nd, ADC_BUF_2nd_LEN, &ADC_remainder)) / 2; ADC[3].read_double += ADC_remainder / 2; ADC[3].remainder_1st = 0; ADC[3].read = ADC[3].read_double; if (ADC[2].read> ADC[2].target){ mode = mode_overcurrent_protection; //关闭dma DMA0CTL &= ~DMAEN; DMA1CTL &= ~DMAEN; TBCCR1 = 0; TBCCR2 = TBCCR0; TBCTL &= ~(MC1 + MC0); //stop mode TBCCTL1 &= ~(OUTMOD_7+OUT); TBCCTL2 &= ~(OUTMOD_7+OUT); TBCCTL2 |= OUT; _delay_us(2000); TBCCTL2 &= ~OUT; IR2110_OFF; }
if (mode == mode_current_closed_loop){ //过充保护 if (ADC[2].read> ADC[2].target){ mode = mode_overcurrent_protection; //关闭dma DMA0CTL &= ~DMAEN; DMA1CTL &= ~DMAEN;
TBCCR1 = 0; TBCCR2 = TBCCR0; TBCTL &= ~(MC1 + MC0); //stop mode TBCCTL1 &= ~(OUTMOD_7+OUT); TBCCTL2 &= ~(OUTMOD_7+OUT);
TBCCTL2 |= OUT; _delay_us(2000); TBCCTL2 &= ~OUT;
IR2110_OFF; } if (ADC[1].read< ADC[1].target- 200){ tb0.pwm1_ccr += 8; } elseif (ADC[1].read> ADC[1].target+ 200){ tb0.pwm1_ccr -= 8; } elseif (ADC[1].read< ADC[1].target- 40){ tb0.pwm1_ccr += 1; } elseif (ADC[1].read> ADC[1].target+ 40){ tb0.pwm1_ccr |