You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

281 lines
13 KiB

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)