Files
CHJ/user/MCU/lhl_adc.c

188 lines
7.3 KiB
C
Raw Normal View History

2026-03-20 21:16:58 +08:00
#include "../main/SystemInclude.h"
////ʹ<><CAB9><EFBFBD>ڲ<EFBFBD><DAB2>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD>
//pAFE->REF_CTRL |=AFE_REF_CTRL_TEMP_SENSER_EN_Msk;
/**------------------------------------------------------------------------
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD> ADC <EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD>׼Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note ʹ<EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD>ο<EFBFBD><EFBFBD><EFBFBD>ѹ VREF<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> VREF <EFBFBD><EFBFBD> VDRIVE <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD>
* @param vref: <EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD>ѹѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> REF_INTERNAL_2P5V
* @param vdrive: VDrive <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> REF_INTERNAL_1P25V <EFBFBD><EFBFBD> REF_INTERNAL_OFF
* @example ADC_REF_Init(REF_INTERNAL_2P5V, REF_INTERNAL_1P25V);
**/
void ADC_REF_Init(u8 vref,u8 vdrive)
{
REF_InitTypeDef REF_InitStructure;
REF_InitStructure.VREF = vref; // <20>ڲ<EFBFBD><DAB2><EFBFBD>׼<EFBFBD><D7BC>ѹ
REF_InitStructure.VDRIVE = vdrive;// VDrive<76><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ
REF_InitStructure.VREF_Boost = DISABLE;
LHL_REF_Init(&REF_InitStructure);
}
/**------------------------------------------------------------------------
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD> ADC Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note <EFBFBD><EFBFBD>׼Դʹ<EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD> VREF<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ˫<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϡ<EFBFBD>
* @param ADCx: ADC ʵ<EFBFBD><EFBFBD> (ADC_0 / ADC_1)
* @param SPS: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD><EFBFBD> SPS_977
* @param Gain: <EFBFBD>ڲ<EFBFBD> PGA <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GAIN32
* @param PChan: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADC0_AIN0
* @param NChan: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADC0_AIN1
* @example ADC_Init(ADC_0, SPS_977, GAIN32, ADC0_AIN0, ADC0_AIN1);
**/
void ADC_Init(ADC_ID_t ADCx ,u8 SPS ,u8 Gain, u8 PChan, u8 NChan )
{
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.AINP = PChan; // ADC0<43><30><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>
ADC_InitStructure.AINM = NChan;
ADC_InitStructure.PGA = Gain; // <20>ڲ<EFBFBD>PGA<47><41><EFBFBD><EFBFBD>x1
ADC_InitStructure.FS = SPS; // ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ADC_InitStructure.Code = ADC_CODE_BIPOLAR; // ˫<><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ADC_InitStructure.Mode = ADC_MODE_CONTINUOUS_CONVERSION; // <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ģʽ
ADC_InitStructure.Trigger = ADC_TRIGGER_SOFTWARE; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ADC_InitStructure.ReferenceSelect = ADC_REF_REFP_to_REFN; // <20>ڲ<EFBFBD><DAB2><EFBFBD>׼
ADC_InitStructure.REF_BUFP = ENABLE; // ʹ<>ܻ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD>
ADC_InitStructure.REF_BUFM = ENABLE;
ADC_InitStructure.REF_Precharge= DISABLE;
// ADC_InitStructure.Reference = 1250.0f; //<2F><>׼ֵ initû<74>õ<EFBFBD>
LHL_ADC_Init(ADCx, &ADC_InitStructure);
LHL_ADC_ITConfig(ADCx, ADC_IT_RDY, ENABLE);
}
/**------------------------------------------------------------------------
* @brief ʹ<EFBFBD>ܻ<EFBFBD><EFBFBD><EFBFBD>ֹ ADC0 <EFBFBD><EFBFBD> ADC1 ͬ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>ģʽ
* @note ͬ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>SPS<EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>
* ADC0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD>Ӧ<EFBFBD>õ<EFBFBD> ADC1<EFBFBD><EFBFBD>
* @param NewState: ENABLE <EFBFBD><EFBFBD> DISABLE
* @example ADC_SyncCmd(ENABLE);
**/
void ADC_SyncCmd(FunctionalState NewState)
{
LHL_ADC_SetSync(NewState);
}
/**------------------------------------------------------------------------
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD> ADC <EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param ADCx: ADC ʵ<EFBFBD><EFBFBD> (ADC_0 / ADC_1)
* @example StartADC(ADC_0);
**/
void StartADC(ADC_ID_t ADCx)
{
(ADCx == ADC_0) ? LHL_ADC_Start(ADC_0): LHL_ADC_Start(ADC_1);
}
/**------------------------------------------------------------------------
* @brief ָֹͣ<EFBFBD><EFBFBD> ADC <EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>
* @param ADCx: ADC ʵ<EFBFBD><EFBFBD> (ADC_0 / ADC_1)
* @example StopADC(ADC_0);
**/
void StopADC(ADC_ID_t ADCx)
{
(ADCx == ADC_0) ? LHL_ADC_Stop(ADC_0): LHL_ADC_Stop(ADC_1);
}
/**------------------------------------------------------------------------
* @brief <EFBFBD><EFBFBD>ȡ ADC ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>24 λԭʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת 16 λ<EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD> 32768<EFBFBD><EFBFBD>
* @note ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD>((ԭʼ<EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ >> 8) + 32768) & 0xFFFF
* @param ADCx: ADC ʵ<EFBFBD><EFBFBD> (ADC_0 / ADC_1)
* @return 16 λ ADC ֵ<EFBFBD><EFBFBD>0~65535<EFBFBD><EFBFBD>
* @example u32 val = ADC_ReadData(ADC_0);
**/
u32 ADC_ReadData(ADC_ID_t ADCx)
{
volatile u32 reg_data = 0;
reg_data = (ADCx == ADC_0) ? LHL_ADC_GetData(ADC_0) : LHL_ADC_GetData(ADC_1);
reg_data = ((((reg_data & 0xFFFFFF) | ((reg_data & 0x800000) ? 0xFF000000 : 0)) >> 8) + 32768) & 0xFFFF;
return reg_data ;
}
/*===========================================================================*/
/* С˯ģʽ<C4A3>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>
ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪӲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ(С˯ģʽ)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD>ֹͣת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˯<EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD>ߺ<EFBFBD><EFBFBD>ı<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>SNOOZE<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>
*/
/**------------------------------------------------------------------------
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD> ADC Ϊ<EFBFBD>͹<EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD> + Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SNOOZE ģʽ<EFBFBD>µ<EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˯<EFBFBD>ߡ<EFBFBD>
* @param ADCx: ADC ʵ<EFBFBD><EFBFBD> (ADC_0 / ADC_1)
* @param SPS: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD><EFBFBD> SPS_10
* @param Gain: <EFBFBD>ڲ<EFBFBD> PGA <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GAIN32
* @param PChan: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADC0_AIN2
* @param NChan: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADC0_AVSS
* @example ADC_Init_For_LowerPower(ADC_0, SPS_10, GAIN32, ADC0_AIN2, ADC0_AVSS);
**/
void ADC_Init_For_LowerPower(ADC_ID_t ADCx, u8 SPS, u8 Gain, u8 PChan, u8 NChan)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.AINP = PChan; // ADC<44><43><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>
ADC_InitStructure.AINM = NChan;
ADC_InitStructure.PGA = Gain; // <20>ڲ<EFBFBD>PGA<47><41><EFBFBD><EFBFBD>
ADC_InitStructure.FS = SPS; // ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ADC_InitStructure.Code = ADC_CODE_BIPOLAR; // ˫<><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ADC_InitStructure.Mode = ADC_MODE_SINGLE_CONVERSION; // <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ģʽ
ADC_InitStructure.Trigger = ADC_TRIGGER_HARDWARE; // Ӳ<><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADC_TRIGGER_HARDWARE ADC_TRIGGER_SOFTWARE
ADC_InitStructure.ReferenceSelect = ADC_REF_REFP_to_REFN; // <20>ڲ<EFBFBD><DAB2><EFBFBD>׼
ADC_InitStructure.REF_BUFP = ENABLE; // ʹ<>ܻ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD>
ADC_InitStructure.REF_BUFM = ENABLE;
ADC_InitStructure.REF_Precharge = DISABLE;
LHL_ADC_Init(ADCx, &ADC_InitStructure);
LHL_ADC_ITConfig(ADCx, ADC_IT_RDY, ENABLE); //RDY_INT = 1
NVIC_EnableIRQ(ADC0_IRQn);
NVIC_SetPriority(ADC0_IRQn, 0);
NVIC_EnableIRQ(ADC1_IRQn);
NVIC_SetPriority(ADC1_IRQn, 0);
}
/*===========================================================================*/
//ADC<44>жϻص<CFBB>==============================================================================================================
static adc_irq_callback_t adc0_irq_callback ,adc1_irq_callback;
/**------------------------------------------------------------------------
* @brief ע<EFBFBD><EFBFBD> ADC ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param ADCx: ADC ʵ<EFBFBD><EFBFBD> (ADC_0 / ADC_1)
* @param tim_irq_callback: <EFBFBD>û<EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>޲<EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
* @note ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD>ʹ<EFBFBD>ܶ<EFBFBD>Ӧ ADC <EFBFBD><EFBFBD> NVIC <EFBFBD>ж<EFBFBD> <EFBFBD><EFBFBD>
* @example ADC_register_irq_callback(ADC_0, my_adc_callback);
**/
void ADC_register_irq_callback(ADC_ID_t ADCx, adc_irq_callback_t tim_irq_callback)
{
if(ADCx == ADC_0) {adc0_irq_callback = tim_irq_callback; NVIC_EnableIRQ(ADC0_IRQn);NVIC_SetPriority(ADC0_IRQn, 0);}
else if(ADCx == ADC_1) {adc1_irq_callback = tim_irq_callback; NVIC_EnableIRQ(ADC1_IRQn);NVIC_SetPriority(ADC1_IRQn, 0);}
}
/**------------------------------------------------------------------------
* @brief ADC0 <EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note <EFBFBD><EFBFBD> ADC0 <EFBFBD><EFBFBD><EFBFBD>ݾ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD>Ļص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><EFBFBD><EFBFBD>
**/
void ADC0_IRQHandler(void)
{
if(LHL_ADC_GetPending(ADC_0, ADC_FLAG_RDY) == SET)
{
if(adc0_irq_callback != NULL) adc0_irq_callback();
}
}
/**------------------------------------------------------------------------
* @brief ADC1 <EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note <EFBFBD><EFBFBD> ADC1 <EFBFBD><EFBFBD><EFBFBD>ݾ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD>Ļص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><EFBFBD><EFBFBD>
**/
void ADC1_IRQHandler(void)
{
if(LHL_ADC_GetPending(ADC_1, ADC_FLAG_RDY) == SET)
{
if(adc1_irq_callback != NULL) adc1_irq_callback();
}
}