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