C51 COMPILER V9.54 MSP_ADC 09/06/2024 11:24:46 PAGE 1 C51 COMPILER V9.54, COMPILATION OF MODULE MSP_ADC OBJECT MODULE PLACED IN ..\out\msp_adc.obj COMPILER INVOKED BY: E:\KeilC51\C51\BIN\C51.EXE ..\source\msp\msp_adc.c LARGE OMF2 OPTIMIZE(0,SIZE) BROWSE ORDER NOINTPR -OMOTE INCDIR(..\source\bsp;..\source\msp;..\source\app;..\source\clib;..\source\cpu;..\source\ctask;..\source\tpc;..\sou -rce\asp;..\source\debug;..\source\msp\uart;..\source\msp\simiic;..\source\bsp\oled;..\source\bsp\TTSSbsp) DEBUG PRINT(.. -\out\msp_adc.lst) TABS(2) OBJECT(..\out\msp_adc.obj) line level source 1 #include "msp_adc.h" *** WARNING C320 IN LINE 51 OF ..\source\bsp\TTSSbsp\bsp_config.h: "MainFre_22M" 2 #include "debug_drv.h" 3 #include "stc_8_delay.h" 4 5 6 /********* 7 1、给 MCU 的 内部 ADC 模块电源打开后,需等待约 1ms, 等 MCU 内部的 ADC 电源稳定 -再让 ADC 工作; 8 2、适当加长对外部信号的采样时间,就是对 ADC 内部采样保持电容的充电或放电 -间,时间够, 内部才能和外部电势相等。 9 19.1.1 ADC 控制寄存器(ADC_CONTR),PWM 触发 ADC 控制 10 符号 地址 B7 B6 B5 B4 B3 B2 B1 B0 11 ADC_CONTR BCH ADC_POWER ADC_START ADC_FLAG ADC_EPWMT ADC_CHS[3:0] 12 ADC_POWER:ADC 13 电源控制位 0: 14 关闭 ADC 电源 1:打开 ADC 电源。 15 建议进入空闲模式和掉电模式前将 ADC 电源关闭,以降低功耗 16 特别注意: 1、给 MCU 的 内部 ADC 模块电源打开后,需等待约 1ms, 等 MCU 内部的 ADC - 电源稳定 后再让 ADC 工作; 17 2、适当加长对外部信号的采样时间,就是对 ADC 内部采样保持电容的充电或放电 -间,时间够内部才能和外部电势相等。 18 ADC_START:ADC 转换启动控制位。写入 1 后开始 ADC 转换,转换完成后硬件自动将此 -清零。 19 0:无影响。即使 ADC 已经开始转换工作,写 0 也不会停止A/D 转换。 20 1:开始 ADC 转换,转换完成后硬件自动将此位清零。 21 ADC_FLAG:ADC 转换结束标志位。当 ADC 完成一次转换后,硬件会自动将此位置 1, 22 并向 CPU 提出 中断请求。此标志位必须软件清零。 23 24 层次 >逻辑 >数据流 >测试 >工具 > 代码 25 套路(方法论)才是最主要的 26 12位 800K 27 反推 28 22M / 64(采样的总时间)= 29 30 *********/ 31 32 33 void L0_ADC_init (unsigned char onf) 34 { 35 1 36 1 if (onf) 37 1 { 38 2 ADC_CONTR = 0; 39 2 D_ADC_POWER_ON(); 40 2 /// 41 2 D_ADC_average(); 42 2 D_EN_EREG(); 43 2 ////500us B0000_1111 1msB0000_1111 44 2 ADCTIM = B1010_0000|B0000_1111;///CSSETUP:ADC 通道选择时间控制 CSHOLD[1:0]:ADC 通道选择 -保持时间控制//22M 45 2 ///SMPDUTY[4:0]:ADC 模拟信号采样时间控制 Tduty(注意:SMPDUTY 一定不能设置 C51 COMPILER V9.54 MSP_ADC 09/06/2024 11:24:46 PAGE 2 -于 01010B) 46 2 ADCCFG = B0010_0000|4;///SPEED[3:0]:设置 ADC 工作时钟频率{FADC=SYSclk/2/(SPEED+1)} 47 2 48 2 49 2 Lc_delay_ms(1); 50 2 /// D_ADC_CH(D_ADC_CH_1_19); 51 2 // D_ADC_START(); 52 2 53 2 // L1_ADC_Readx(D_ADC_CH_1_19); 54 2 55 2 56 2 printfs("\r\n L0_ADC_init on"); 57 2 58 2 } 59 1 else 60 1 { 61 2 62 2 } 63 1 } 64 65 66 67 68 /// L1_ADC_Readx(D_ADC_CH_1_19); 69 70 U16 L1_ADC_Readx(u8 CHA) 71 { 72 1 vU16 adc_data; 73 1 vU32 overtimes; 74 1 int *BGV; //内部1.19V参考信号源值存放在idata中 75 1 //idata的EFH地址存放高字节 76 1 //idata的F0H地址存放低字节 77 1 //电压单位为毫伏(mV) 78 1 BGV = (int idata *)0xef; 79 1 80 1 /// vcc = (int)(1024L * *BGV / res); //(10位ADC算法)计算VREF管脚电压,即电池电压 81 1 // vcc = (int)(4096L * *BGV / res); //(12位ADC算法)计算VREF管脚电压,即电池电压 82 1 //注意,此电压的单位为毫伏(mV) 83 1 84 1 85 1 D_ADC_CH(CHA); 86 1 D_ADC_START(); 87 1 NOP2(); 88 1 ///BITN_S(ADCEXCFG,) 89 1 while(0 == D_ADC_OVER()) 90 1 { 91 2 if(overtimes++>600000)//// 92 2 { 93 3 printf2("\r\n !3A%x W%x\t",(int)ADC_CONTR,(int)CHA); 94 3 return 0;/// !3Ac7 W7 291 95 3 } 96 2 } 97 1 D_ADC_CLEARFLAG(); 98 1 99 1 adc_data = ADC_RES; 100 1 adc_data <<= 8; 101 1 adc_data |= ADC_RESL; 102 1 ///adc_data >>= 3; 103 1 //// r = adc_data; 104 1 return adc_data; 105 1 } 106 C51 COMPILER V9.54 MSP_ADC 09/06/2024 11:24:46 PAGE 3 107 #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); C51 COMPILER V9.54 MSP_ADC 09/06/2024 11:24:46 PAGE 4 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; C51 COMPILER V9.54 MSP_ADC 09/06/2024 11:24:46 PAGE 5 //L0_uart0_ushex(adc_data); //L0_uart0_0d0a(); return (adc_data); //返回A/D转换结果(8位) } #endif MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 255 ---- CONSTANT SIZE = 33 ---- XDATA SIZE = 11 ---- PDATA SIZE = ---- ---- DATA SIZE = ---- ---- IDATA SIZE = ---- ---- BIT SIZE = ---- ---- EDATA SIZE = ---- ---- HDATA SIZE = ---- ---- XDATA CONST SIZE = ---- ---- FAR CONST SIZE = ---- ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)