1 /********************************** (C) COPYRIGHT *******************************
2 * File Name          : CH57x_adc.c
3 * Author             : WCH
4 * Version            : V1.1
5 * Date               : 2020/04/01
6 * Description
7 *******************************************************************************/
8 
9 #include "CH57x_common.h"
10 
11 
12 /*******************************************************************************
13 * Function Name  : ADC_DataCalib_Rough
14 * Description    : 采样数据粗调,获取偏差值
15 *                  注意,使用粗调校准,必须保证 PA5(AIN1)设置为浮空输入模式,管脚外部不要有电压
16 * Input          : None
17 * Return         : 偏差值
18 *******************************************************************************/
ADC_DataCalib_Rough(void)19 signed short ADC_DataCalib_Rough( void )        // 采样数据粗调,获取偏差值
20 {
21     UINT16  i;
22     UINT32  sum=0;
23     UINT8  ch=0;        // 备份通道
24     UINT8   ctrl=0;     // 备份控制寄存器
25 
26     ch = R8_ADC_CHANNEL;
27     ctrl = R8_ADC_CFG;
28 
29     ADC_ChannelCfg( 1 );
30     R8_ADC_CFG |= RB_ADC_OFS_TEST;      // 进入测试模式
31     R8_ADC_CONVERT = RB_ADC_START;
32     while( R8_ADC_CONVERT & RB_ADC_START );
33     for(i=0; i<16; i++)
34     {
35         R8_ADC_CONVERT = RB_ADC_START;
36         while( R8_ADC_CONVERT & RB_ADC_START );
37         sum += (~R16_ADC_DATA)&RB_ADC_DATA;
38     }
39     sum = (sum+8)>>4;
40     R8_ADC_CFG &= ~RB_ADC_OFS_TEST;      // 关闭测试模式
41 
42 
43     R8_ADC_CHANNEL = ch;
44     R8_ADC_CFG = ctrl;
45     return (2048 - sum);
46 }
47 
ADC_DataCalib_Fine(PUINT16 dat,ADC_SignalPGATypeDef ga)48 void ADC_DataCalib_Fine( PUINT16 dat, ADC_SignalPGATypeDef ga )        // 采样数据细调
49 {
50     UINT32  d = (UINT32)*dat;
51 
52     switch( ga )
53     {
54         case ADC_PGA_1_4:         // y=0.973x+55.188
55             *dat = (996*d + 56513 + 512)>>10;
56             break;
57 
58         case ADC_PGA_1_2:         // y=0.974x+55.26
59             *dat = (997*d + 56586 + 512)>>10;
60             break;
61 
62         case ADC_PGA_0:         // y=0.975x+53.63
63             *dat = (998*d + 54917 + 512)>>10;
64             break;
65 
66         case ADC_PGA_2:         // y=0.975x+51.58
67             *dat = (998*d + 52818 + 512)>>10;
68             break;
69     }
70 }
71 
72 /*******************************************************************************
73 * Function Name  : ADC_ExtSingleChSampInit
74 * Description    : 外部信号单通道采样初始化
75 * Input          : sp:
76                     refer to ADC_SampClkTypeDef
77                    ga:
78                     refer to ADC_SignalPGATypeDef
79 * Return         : None
80 *******************************************************************************/
ADC_ExtSingleChSampInit(ADC_SampClkTypeDef sp,ADC_SignalPGATypeDef ga)81 void ADC_ExtSingleChSampInit( ADC_SampClkTypeDef sp, ADC_SignalPGATypeDef ga )
82 {
83     R8_ADC_CFG = RB_ADC_POWER_ON            \
84                 |RB_ADC_BUF_EN              \
85                 |( sp<<6 )                  \
86                 |( ga<<4 )  ;
87 }
88 
89 /*******************************************************************************
90 * Function Name  : ADC_ExtDiffChSampInit
91 * Description    : 外部信号差分通道采样初始化
92 * Input          : sp:
93                     refer to ADC_SampClkTypeDef
94                    ga:
95                     refer to ADC_SignalPGATypeDef
96 * Return         : None
97 *******************************************************************************/
ADC_ExtDiffChSampInit(ADC_SampClkTypeDef sp,ADC_SignalPGATypeDef ga)98 void ADC_ExtDiffChSampInit( ADC_SampClkTypeDef sp, ADC_SignalPGATypeDef ga )
99 {
100     R8_ADC_CFG = RB_ADC_POWER_ON            \
101                 |RB_ADC_DIFF_EN             \
102                 |( sp<<6 )                  \
103                 |( ga<<4 )  ;
104 }
105 
106 /*******************************************************************************
107 * Function Name  : ADC_InterTSSampInit
108 * Description    : 内置温度传感器采样初始化
109 * Input          : None
110 * Return         : None
111 *******************************************************************************/
ADC_InterTSSampInit(void)112 void ADC_InterTSSampInit( void )
113 {
114     R8_TEM_SENSOR |= RB_TEM_SEN_PWR_ON;
115     R8_ADC_CHANNEL = CH_INTE_VTEMP;
116     R8_ADC_CFG = RB_ADC_POWER_ON            \
117                 |( 2<<4 )   ;
118 }
119 
120 /*******************************************************************************
121 * Function Name  : ADC_InterBATSampInit
122 * Description    : 内置电池电压采样初始化
123 * Input          : None
124 * Return         : None
125 *******************************************************************************/
ADC_InterBATSampInit(void)126 void ADC_InterBATSampInit( void )
127 {
128     R8_ADC_CHANNEL = CH_INTE_VBAT;
129     R8_ADC_CFG = RB_ADC_POWER_ON            \
130                 |RB_ADC_BUF_EN              \
131                 |( 0<<4 )   ;       // 使用-12dB模式,
132 }
133 
134 
135 /*******************************************************************************
136 * Function Name  : TouchKey_ChSampInit
137 * Description    : 触摸按键通道采样初始化
138 * Input          : None
139 * Return         : None
140 *******************************************************************************/
TouchKey_ChSampInit(void)141 void TouchKey_ChSampInit( void )
142 {
143     R8_ADC_CFG = RB_ADC_POWER_ON | RB_ADC_BUF_EN | ( 2<<4 );
144     R8_TKEY_CTRL = RB_TKEY_PWR_ON;
145 }
146 
147 /*******************************************************************************
148 * Function Name  : ADC_ExcutSingleConver
149 * Description    : ADC执行单次转换
150 * Input          : None
151 * Return         : ADC转换后的数据
152 *******************************************************************************/
ADC_ExcutSingleConver(void)153 UINT16 ADC_ExcutSingleConver( void )
154 {
155     R8_ADC_CONVERT = RB_ADC_START;
156     while( R8_ADC_CONVERT & RB_ADC_START );
157 
158     return ( R16_ADC_DATA&RB_ADC_DATA );
159 }
160 
161 /*******************************************************************************
162 * Function Name  : TouchKey_ExcutSingleConver
163 * Description    : TouchKey转换后数据
164 * Input          : d:  Touchkey充放电时间,高4bit-放电时间,整个8bit-充电时间
165 * Return         : 当前TouchKey等效数据
166 *******************************************************************************/
TouchKey_ExcutSingleConver(UINT8 d)167 UINT16 TouchKey_ExcutSingleConver( UINT8 d )
168 {
169     R8_TKEY_CTRL = RB_TKEY_PWR_ON;
170     R8_TKEY_CNT = d;
171     while( R8_TKEY_CTRL &  RB_TKEY_ACTION );
172 
173     return ( R16_ADC_DATA&RB_ADC_DATA );
174 }
175 
176 
177 /*******************************************************************************
178 * Function Name  : ADC_GetCurrentTS
179 * Description    : 获取当前采样的温度值(℃)
180 * Input          : ts_v:当前温度传感器采样输出
181 * Return         : 转换后的温度值(℃)
182 *******************************************************************************/
ADC_GetCurrentTS(UINT16 ts_v)183 int ADC_GetCurrentTS( UINT16 ts_v )
184 {
185     UINT16  vol_ts;
186     UINT16  D85_tem, D85_vol;
187     UINT16  D25_tem, D25_vol;
188     UINT16  temperK;
189     UINT32  temp;
190     UINT8   sum, sumck;
191     int     cal;
192 
193     temperK = 64;    // mV/16^C
194     vol_ts = (ts_v*1060)>>11;
195     temp = (*((PUINT32)ROM_TMP_25C_ADDR));
196     D25_tem = temp;
197     D25_vol = (temp>>16);
198 
199     if( D25_vol != 0 ){ // 默认系数换算
200         // T = T85 + (V-V85)*16/D25
201         cal =  (D25_tem*temperK + vol_ts*16 + (temperK>>1) - D25_vol*16) / temperK ;
202         return ( cal );
203     }
204     else{  // 内置系数换算  D25_tem
205         temp = (*((PUINT32)ROM_TMP_85C_ADDR));
206         sum = (UINT8)(temp>>24);        // 最高字节
207         sumck = (UINT8)(temp>>16);
208         sumck += (UINT8)(temp>>8);
209         sumck += (UINT8)temp;
210         if( sum != sumck )      return 0xff;        // 校验和出错
211 
212         temperK = D25_tem;      // D25_tem = temperK
213         D85_tem = (UINT16)((temp>>16)&0x00ff);
214         D85_vol = (UINT16)temp;
215 
216         // T = T85 + (V-V85)*16/D25
217         cal =  (D85_tem*temperK + vol_ts*16 + (temperK>>1) - D85_vol*16) / temperK ;
218         return ( cal );
219     }
220 }
221 
222 
223 
224