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.
282 lines
13 KiB
282 lines
13 KiB
10 months ago
|
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)
|