BLE_DCF_TYQ_CH592F/StdPeriphDriver/CH58x_adc.c

454 lines
11 KiB
C
Raw Normal View History

2024-12-02 16:26:55 +08:00
/********************************** (C) COPYRIGHT *******************************
2025-02-21 14:38:41 +08:00
* File Name : CH58x_adc.c
2024-12-02 16:26:55 +08:00
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
2025-02-21 14:38:41 +08:00
* Description : source file(ch585/ch584)
2024-12-02 16:26:55 +08:00
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
2024-12-02 16:26:55 +08:00
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
2025-02-21 14:38:41 +08:00
#include "CH58x_common.h"
2024-12-02 16:26:55 +08:00
/*********************************************************************
* @fn ADC_DataCalib_Rough
*
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴֵ<EFBFBD>,<EFBFBD><EFBFBD>ȡƫ<EFBFBD><EFBFBD>ֵ,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô˺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡУ׼ֵ
*
* @param none
*
* @return ƫ<EFBFBD><EFBFBD>
*/
signed short ADC_DataCalib_Rough(void) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴֵ<DDB4>,<2C><>ȡƫ<C8A1><C6AB>ֵ
{
uint16_t i;
uint32_t sum = 0;
uint8_t ch = 0; // <20><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>
uint8_t cfg = 0; // <20><><EFBFBD><EFBFBD>
ch = R8_ADC_CHANNEL;
cfg = R8_ADC_CFG;
R8_ADC_CFG |= RB_ADC_OFS_TEST; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
R8_ADC_CFG &= ~RB_ADC_DIFF_EN; // <20>رղ<D8B1><D5B2><EFBFBD>
R8_ADC_CONVERT |= RB_ADC_START;
while(R8_ADC_CONVERT & RB_ADC_START);
for(i = 0; i < 16; i++)
{
R8_ADC_CONVERT |= RB_ADC_START;
while(R8_ADC_CONVERT & RB_ADC_START);
sum += (~R16_ADC_DATA) & RB_ADC_DATA;
}
sum = (sum + 8) >> 4;
R8_ADC_CFG = cfg; // <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ֵ
R8_ADC_CHANNEL = ch;
return (2048 - sum);
}
/*********************************************************************
* @fn ADC_ExtSingleChSampInit
*
* @brief <EFBFBD>ⲿ<EFBFBD>źŵ<EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
*
* @param sp - refer to ADC_SampClkTypeDef
* @param ga - refer to ADC_SignalPGATypeDef
*
* @return none
*/
void ADC_ExtSingleChSampInit(ADC_SampClkTypeDef sp, ADC_SignalPGATypeDef ga)
{
R8_TKEY_CFG &= ~RB_TKEY_PWR_ON;
R8_ADC_CFG = RB_ADC_POWER_ON | RB_ADC_BUF_EN | (sp << 6) | ((ga&0xF) << 4);
if( ga & ADC_PGA_2_ )
{
R8_ADC_CONVERT |= RB_ADC_PGA_GAIN2;
}
else
{
R8_ADC_CONVERT &= ~RB_ADC_PGA_GAIN2;
}
}
/*********************************************************************
* @fn ADC_ExtDiffChSampInit
*
* @brief <EFBFBD>ⲿ<EFBFBD>źŲ<EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
*
* @param sp - refer to ADC_SampClkTypeDef
* @param ga - refer to ADC_SignalPGATypeDef
*
* @return none
*/
void ADC_ExtDiffChSampInit(ADC_SampClkTypeDef sp, ADC_SignalPGATypeDef ga)
{
R8_TKEY_CFG &= ~RB_TKEY_PWR_ON;
R8_ADC_CFG = RB_ADC_POWER_ON | RB_ADC_DIFF_EN | (sp << 6) | ((ga&0xF) << 4);
if( ga & ADC_PGA_2_ )
{
R8_ADC_CONVERT |= RB_ADC_PGA_GAIN2;
}
else
{
R8_ADC_CONVERT &= ~RB_ADC_PGA_GAIN2;
}
}
/*********************************************************************
* @fn ADC_InterTSSampInit
*
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
*
* @param none
*
* @return none
*/
void ADC_InterTSSampInit(void)
{
R8_TKEY_CFG &= ~RB_TKEY_PWR_ON;
R8_TEM_SENSOR = RB_TEM_SEN_PWR_ON;
R8_ADC_CHANNEL = CH_INTE_VTEMP;
R8_ADC_CFG = RB_ADC_POWER_ON | RB_ADC_DIFF_EN | (3 << 4);
R8_ADC_CONVERT &= ~RB_ADC_PGA_GAIN2;
}
/*********************************************************************
* @fn ADC_InterBATSampInit
*
* @brief <EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
*
* @param none
*
* @return none
*/
void ADC_InterBATSampInit(void)
{
R8_TKEY_CFG &= ~RB_TKEY_PWR_ON;
R8_ADC_CHANNEL = CH_INTE_VBAT;
R8_ADC_CFG = RB_ADC_POWER_ON | RB_ADC_BUF_EN | (0 << 4); // ʹ<><CAB9>-12dBģʽ
R8_ADC_CONVERT &= ~RB_ADC_PGA_GAIN2;
}
/*********************************************************************
* @fn TouchKey_ChSampInit
*
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
*
* @param none
*
* @return none
*/
void TouchKey_ChSampInit(void)
{
2025-02-21 14:38:41 +08:00
R8_ADC_CFG = RB_ADC_POWER_ON | RB_ADC_BUF_EN | (ADC_PGA_0 << 4) | (SampleFreq_8_or_4 << 6);
2024-12-02 16:26:55 +08:00
R8_ADC_CONVERT &= ~RB_ADC_PGA_GAIN2;
2025-02-21 14:38:41 +08:00
R8_TKEY_CFG = RB_TKEY_PWR_ON | RB_TKEY_CURRENT;
2024-12-02 16:26:55 +08:00
}
/*********************************************************************
* @fn ADC_ExcutSingleConver
*
* @brief ADCִ<EFBFBD>е<EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>
*
* @param none
*
* @return ADCת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint16_t ADC_ExcutSingleConver(void)
{
R8_ADC_CONVERT |= RB_ADC_START;
while(R8_ADC_CONVERT & RB_ADC_START);
return (R16_ADC_DATA & RB_ADC_DATA);
}
/*********************************************************************
* @fn TouchKey_ExcutSingleConver
*
* @brief TouchKeyת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param charg - Touchkey<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>,5bits<EFBFBD><EFBFBD>Ч, t=charg*Tadc
* @param disch - Touchkey<EFBFBD>ŵ<EFBFBD>ʱ<EFBFBD><EFBFBD>,3bits<EFBFBD><EFBFBD>Ч, t=disch*Tadc
*
* @return <EFBFBD><EFBFBD>ǰTouchKey<EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint16_t TouchKey_ExcutSingleConver(uint8_t charg, uint8_t disch)
{
R8_TKEY_COUNT = (disch << 5) | (charg & 0x1f);
R8_TKEY_CONVERT = RB_TKEY_START;
while(R8_TKEY_CONVERT & RB_TKEY_START);
return (R16_ADC_DATA & RB_ADC_DATA);
}
/*********************************************************************
* @fn ADC_AutoConverCycle
*
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param cycle - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ(256-cycle)*16*Tsys
*
* @return none
*/
void ADC_AutoConverCycle(uint8_t cycle)
{
R8_ADC_AUTO_CYCLE = cycle;
}
/*********************************************************************
* @fn ADC_DMACfg
*
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>DMA<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param s - <EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DMA<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param startAddr - DMA <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ
* @param endAddr - DMA <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
* @param m - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>DMAģʽ
*
* @return none
*/
void ADC_DMACfg(uint8_t s, uint32_t startAddr, uint32_t endAddr, ADC_DMAModeTypeDef m)
{
if(s == DISABLE)
{
R8_ADC_CTRL_DMA &= ~(RB_ADC_DMA_ENABLE | RB_ADC_IE_DMA_END);
}
else
{
2025-02-21 14:38:41 +08:00
R32_ADC_DMA_BEG = startAddr&0x1FFFF;
R32_ADC_DMA_END = endAddr&0x1FFFF;
2024-12-02 16:26:55 +08:00
if(m)
{
R8_ADC_CTRL_DMA |= RB_ADC_DMA_LOOP | RB_ADC_IE_DMA_END | RB_ADC_DMA_ENABLE;
}
else
{
R8_ADC_CTRL_DMA &= ~RB_ADC_DMA_LOOP;
R8_ADC_CTRL_DMA |= RB_ADC_IE_DMA_END | RB_ADC_DMA_ENABLE;
}
}
}
/*********************************************************************
* @fn adc_to_temperature_celsius
*
* @brief Convert ADC value to temperature(Celsius)
*
* @param adc_val - adc value
*
* @return temperature (Celsius)
*/
int adc_to_temperature_celsius(uint16_t adc_val)
{
uint32_t C25 = 0;
int temp;
2025-03-27 10:22:43 +08:00
C25 = (*((uint32_t*)ROM_CFG_TMP_25C));
2024-12-02 16:26:55 +08:00
/* current temperature = standard temperature + (adc deviation * adc linearity coefficient) */
2024-12-02 16:26:55 +08:00
temp = (((C25 >> 16) & 0xFFFF) ? ((C25 >> 16) & 0xFFFF) : 25) + \
(adc_val - ((int)(C25 & 0xFFFF))) * 100 / 283;
return (temp);
}
2025-02-21 14:38:41 +08:00
/*********************************************************************
* @fn ADC_VoltConverSignalPGA_MINUS_12dB
*
* @brief -12dB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱADC<EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD>ֵת<EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>ѹ(mV)
*
* @param adc_data - ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*
* @return <EFBFBD><EFBFBD>ѹ(mV)
*/
int ADC_VoltConverSignalPGA_MINUS_12dB(uint16_t adc_data)
{
return (((int)adc_data*1050+256)/512 - 3*1050);
}
/*********************************************************************
* @fn ADC_VoltConverSignalPGA_MINUS_6dB
*
* @brief -6dB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱADC<EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD>ֵת<EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>ѹ(mV)
*
* @param adc_data - ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*
* @return <EFBFBD><EFBFBD>ѹ(mV)
*/
int ADC_VoltConverSignalPGA_MINUS_6dB(uint16_t adc_data)
{
return (((int)adc_data*1050+512)/1024 - 1*1050);
}
/*********************************************************************
* @fn ADC_VoltConverSignalPGA_0dB
*
* @brief 0dB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱADC<EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD>ֵת<EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>ѹ(mV)
*
* @param adc_data - ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*
* @return <EFBFBD><EFBFBD>ѹ(mV)
*/
int ADC_VoltConverSignalPGA_0dB(uint16_t adc_data)
{
return (((int)adc_data*1050+1024)/2048);
}
/*********************************************************************
* @fn ADC_VoltConverSignalPGA_6dB
*
* @brief 6dB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱADC<EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD>ֵת<EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>ѹ(mV)
*
* @param adc_data - ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*
* @return <EFBFBD><EFBFBD>ѹ(mV)
*/
int ADC_VoltConverSignalPGA_6dB(uint16_t adc_data)
{
return (((int)adc_data*1050+2048)/4096 + 525);
}
/*********************************************************************
* @fn ADC_VoltConverSignalPGA_12dB
*
* @brief 12dB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱADC<EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD>ֵת<EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>ѹ(mV)
*
* @param adc_data - ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*
* @return <EFBFBD><EFBFBD>ѹ(mV)
*/
int ADC_VoltConverSignalPGA_12dB(uint16_t adc_data)
{
return (((int)adc_data*1050)/8192 + 788); //787.5
}
/*********************************************************************
* @fn ADC_VoltConverSignalPGA_18dB
*
* @brief 18dB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱADC<EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD>ֵת<EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>ѹ(mV)
*
* @param adc_data - ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*
* @return <EFBFBD><EFBFBD>ѹ(mV)
*/
int ADC_VoltConverSignalPGA_18dB(uint16_t adc_data)
{
return (((int)adc_data*1050+4096)/16384 + 919); //918.75
}
/*********************************************************************
* @fn ADC_VoltConverSignalPGA_24dB
*
* @brief 24dB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱADC<EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD>ֵת<EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>ѹ(mV)
*
* @param adc_data - ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*
* @return <EFBFBD><EFBFBD>ѹ(mV)
*/
int ADC_VoltConverSignalPGA_24dB(uint16_t adc_data)
{
return (((int)adc_data*1050+28672)/32768 + 984); //984.375
}
/*********************************************************************
* @fn ADC_VoltConverDiffPGA_MINUS_12dB
*
* @brief -12dB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱADC<EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD>ֵת<EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>ѹ(mV)
*
* @param adc_data - ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*
* @return <EFBFBD><EFBFBD>ѹ(mV)
*/
int ADC_VoltConverDiffPGA_MINUS_12dB(uint16_t adc_data)
{
return (((int)adc_data*1050+256)/512 - 4*1050);
}
/*********************************************************************
* @fn ADC_VoltConverDiffPGA_MINUS_6dB
*
* @brief -6dB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱADC<EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD>ֵת<EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>ѹ(mV)
*
* @param adc_data - ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*
* @return <EFBFBD><EFBFBD>ѹ(mV)
*/
int ADC_VoltConverDiffPGA_MINUS_6dB(uint16_t adc_data)
{
return (((int)adc_data*1050+512)/1024 - 2*1050);
}
/*********************************************************************
* @fn ADC_VoltConverDiffPGA_0dB
*
* @brief 0dB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱADC<EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD>ֵת<EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>ѹ(mV)
*
* @param adc_data - ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*
* @return <EFBFBD><EFBFBD>ѹ(mV)
*/
int ADC_VoltConverDiffPGA_0dB(uint16_t adc_data)
{
return (((int)adc_data*1050+1024)/2048 - 1*1050);
}
/*********************************************************************
* @fn ADC_VoltConverDiffPGA_6dB
*
* @brief 6dB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱADC<EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD>ֵת<EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>ѹ(mV)
*
* @param adc_data - ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*
* @return <EFBFBD><EFBFBD>ѹ(mV)
*/
int ADC_VoltConverDiffPGA_6dB(uint16_t adc_data)
{
return (((int)adc_data*1050+2048)/4096 - 525);
}
/*********************************************************************
* @fn ADC_VoltConverDiffPGA_12dB
*
* @brief 12dB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱADC<EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD>ֵת<EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>ѹ(mV)
*
* @param adc_data - ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*
* @return <EFBFBD><EFBFBD>ѹ(mV)
*/
int ADC_VoltConverDiffPGA_12dB(uint16_t adc_data)
{
return (((int)adc_data*1050)/8192 - 262); //262.5
}
/*********************************************************************
* @fn ADC_VoltConverDiffPGA_18dB
*
* @brief 18dB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱADC<EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD>ֵת<EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>ѹ(mV)
*
* @param adc_data - ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*
* @return <EFBFBD><EFBFBD>ѹ(mV)
*/
int ADC_VoltConverDiffPGA_18dB(uint16_t adc_data)
{
return (((int)adc_data*1050+4096)/16384 - 131); //131.25
}
/*********************************************************************
* @fn ADC_VoltConverDiffPGA_24dB
*
* @brief 24dB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱADC<EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD>ֵת<EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>ѹ(mV)
*
* @param adc_data - ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*
* @return <EFBFBD><EFBFBD>ѹ(mV)
*/
int ADC_VoltConverDiffPGA_24dB(uint16_t adc_data)
{
return (((int)adc_data*1050+28672)/32768 - 66); //65.625
}