CH57x_adc.c 7.4 KB

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