#include "../msp/msp_adc.h" #include "../msp/uart0.h" #include void L0_ADC_init(void) { P0M0 = 0x00; P0M1 = 0x10; //设置P0.4为ADC口 ADC_CONTR = 0; D_ADC_POWER_ON(); //打开ADC电源 // D_ADC_average(); // D_EN_EREG(); ///CSSETUP:ADC 通道选择时间控制 CSHOLD[1:0]:ADC 通道选择保持时间控制//22M ///SMPDUTY[4:0]:ADC 模拟信号采样时间控制 Tduty(注意:SMPDUTY 一定不能设置小于 01010B) ADCTIM = B1010_0000|B0000_1111; ADCCFG = B0010_0000|4; //SPEED[3:0]:设置 ADC 工作时钟频率{FADC=SYSclk/2/(SPEED+1)} Lc_delay_ms(1); //给MCU的内部ADC模块电源打开后,需等待约1ms,等MCU内部的ADC电源稳定后再让ADC工作 D_ADC_CH(D_ADC_CH_12); //选择ADC12(P04) D_ADC_START(); L0_uart0_sendstr("\r\n L0_ADC_init on"); } U16 L1_ADC_Read(u8 CHA) { vU16 adc_data; vU32 overtimes; int *BGV; //内部1.19V参考信号源值存放在idata中 //idata的EFH地址存放高字节 //idata的F0H地址存放低字节 BGV = (int idata *)0xef; //vcc = (int)(4096L * *BGV / res); //(12位ADC算法)计算VREF管脚电压,即电池电压 //注意,此电压的单位为毫伏(mV) D_ADC_CH(CHA); D_ADC_START(); // NOP2(); NOP(); NOP(); // BITN_S(ADCEXCFG,) // while(1 == D_ADC_OVER()) // { // if(overtimes++ > 600000)//// // { // // printf2("\r\n !3A%x W%x\t",(int)ADC_CONTR,(int)CHA); // L0_uart0_sendstr("ADC_CONTR = "); // L0_uart0_ushex(ADC_CONTR); // L0_uart0_0d0a(); // L0_uart0_sendstr("CHA = "); // L0_uart0_ushex(CHA); // return 0;/// !3Ac7 W7 291 // } // } D_ADC_CLEARFLAG(); adc_data = ADC_RES; adc_data <<= 8; adc_data |= ADC_RESL; ///adc_data >>= 3; ///r = adc_data; return adc_data; } //平均值滤波 U16 ADC_Average_Filter(U8 N) { U16 sum = 0; U16 Aver = 0; U8 i; U16 arr[10] = 0; FP32 Variance = 0; // 平均值 for(i = 0; i < N; i++) { arr[i] = L1_ADC_Read(12); sum += L1_ADC_Read(12); } Aver = sum/N; for (i = 0; i < N; i++) { L0_uart0_ushex(arr[i]); L0_uart0_0d0a(); } // 方差 for(i = 0; i < N; i++) { Variance += (arr[i] - Aver) * (arr[i] - Aver); } Variance /= N; // printf("%.7f", Variance); return Aver; } #if 0 U16 L1_ADC_Read(u8 CHA) { vU16 adc_data; ADC_CONTR &=0xF8; ADC_CONTR |=0x40;//启动AD转换 //ADC_CONTR |= CHA; CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位) ADC_CONTR = (ADC_CONTR & 0xF0) | CHA; NOP(); NOP(); while (!(ADC_CONTR & 0x20)); //查询ADC完成标志 ADC_CONTR &= ~0x20; //清标志 adc_data = ADC_RES; adc_data <<= 8; adc_data |= ADC_RESL; //adc_data = adc_data<<2; //adc_data = ADC_RESL & 0X03; //adc_data = adc_data | adc_data; ///L0_uart1_sendstr("ADC:"); ///L0_uart1_ushex(adc_data); ///L0_uart1_0d0a(); return (adc_data); //返回A/D转换结果(8位) } ///D_cmd_filter_adc L3_ADC_debug(D_cmd_filter_adc) void L3_ADC_debug(u8 filter) { u8 i; if(filter == Ts_debug.td->filter) {///filter num d1 d2 d3 ....dn //// FD 08 11 22 33 44 55 66 77 88 L1_uartD_uchexArray(Ts_debug.td,Ts_debug.td->R1); if(0x10 == Ts_debug.td->ocr)///read 读,判断哪个adc读取 {//fa 05 f1 33 10 //NUM: 0 1 2 3 4 // Fx R1 R2 R3 ocr // sla reg1 num /// f1 32 15 06 10 //printf("\r\n ch(%d)=",(int)Ts_debug.td->R2); for(i = 0xf1;i <= 0xf8;i++) { Ts_debug.au16 = L1_ADC_Read_PT(i); printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc1 } /* Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf2); printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc2 Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf3); printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc3 Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf4); printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc4 Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf5 ); printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc5 Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf6); printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc6 Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf7); printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc7 Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf8); printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc8 */ } else if(0x11 == Ts_debug.td->ocr) { //printf("\r\n ch(%d)=",(int)Ts_debug.td->R1); //Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R1); } else if(0x12 == Ts_debug.td->ocr) { } else { //printf"(\r\n ch(%d)=",(int)Ts_debug.td->R1); //Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R1); } } } U16 L1_ADC_Read_VBAT (unsigned char CHA)//CHA通道号 { U16 adc_data; #if 0 U8 AD_FIN=0; //存储A/D转换标志 //CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位) ADC_CONTR = 0x40; //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置 Lc_delay_nop(1); //ADC_CONTR |= CHA; //选择A/D当前通道 //Lc_delay_nop(1); ADC_CONTR |= 0x80; //启动A/D电源 Lc_delay_ms(1); //使输入电压达到稳定(1ms即可) ADC_CFG = 0x20; Lc_delay_nop(1); CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位) //ADC_CONTR |= CHA; //选择A/D当前通道 ADC_CONTR = (ADC_CONTR & 0xF0) | CHA; Lc_delay_nop(1); ADC_CONTR |= 0x40; //启动AD转换 NOP(); NOP(); while (!(ADC_CONTR & 0x20)); //查询ADC完成标志 ADC_CONTR &= ~0x20; //清完成标志 //P2 = ADC_RES; //读取ADC结果 #endif ADC_CONTR &=0xF8; ADC_CONTR |=0x40;//启动AD转换 //ADC_CONTR |= CHA; ADC_CONTR = (ADC_CONTR & 0xF0) | CHA; NOP(); NOP(); while (!(ADC_CONTR & 0x20)); //查询ADC完成标志 ADC_CONTR &= ~0x20; //清标志 adc_data = ADC_RES; adc_data <<= 8; adc_data |= ADC_RESL; //adc_data = adc_data<<2; //adc_data = ADC_RESL & 0X03; //adc_data = adc_data | adc_data; //L0_uart0_ushex(adc_data); //L0_uart0_0d0a(); return (adc_data); //返回A/D转换结果(8位) } #endif