ADC通道采集
static uint32_t GetVOLSample_POLL(uint32_t channel, uint32_t *ADCRdresult){
uint32_t counter = 0;
uint32_t EOC_Flag;
uint8_t State;
FL_RCC_SetADCPrescaler(FL_RCC_ADC_PSC_DIV8); //配置ADC工作时钟分频
FL_VREF_EnableVREFBuffer(VREF); //使能VREF BUFFER,
//为了考虑功耗BUFFER可关闭,从使能到ADC可以正常采样需要100us的建立时间,本例程配置慢速通道较长的采样时间,来保证建立时间满足。
FL_DelayMs(100);
FL_ADC_DisableSequencerChannel(ADC, FL_ADC_ALL_CHANNEL); //清空打开的通道
FL_ADC_EnableSequencerChannel(ADC, channel); //通道选择
FL_ADC_ClearFlag_EndOfConversion(ADC); //清标志
FL_ADC_Enable(ADC); //启动ADC
FL_ADC_EnableSWConversion(ADC); //开始转换
do
{
EOC_Flag = FL_ADC_IsActiveFlag_EndOfConversion(ADC);
counter++;
} while((counter != 0xFFFFFFFFU) && (EOC_Flag == 0U)); //等待转换完成
if(EOC_Flag == 0x01U)
{
FL_ADC_ClearFlag_EndOfConversion(ADC); //清标志
*ADCRdresult = FL_ADC_ReadConversionData(ADC); //获取采样值
FL_ADC_Disable(ADC); //关闭ADC
FL_ADC_DisableSequencerChannel(ADC, channel); //通道关闭
FL_VREF_DisableVREFBuffer(VREF); //关闭VREF BUFFER
State = 0;
}
else
{
State = 1 ;
}
return State;
}
GetTSample_State = GetVOLSample_POLL(FL_ADC_INTERNAL_TS, &GetTSSample);
为什么这样用采集到的数据与例程里面的不一样啊:dizzy:
以下是例程:
GetTSample_State = GetTSSample_POLL(&GetTSSample);
static uint32_t GetTSSample_POLL(uint32_t *ADCRdresult)
{
uint32_t counter = 0;
uint32_t EOC_Flag;
uint8_t State;
FL_RCC_SetADCPrescaler(FL_RCC_ADC_PSC_DIV8); //配置ADC工作时钟分频
FL_VREF_EnableVPTATBuffer(VREF); //使能PTATBUFFER
//为了考虑功耗BUFFER可关闭,从使能到ADC可以正常采样需要100us的建立时间,本例程配置慢速通道较长的采样时间,来保证建立时间满足。
FL_ADC_DisableSequencerChannel(ADC, FL_ADC_ALL_CHANNEL); //清空打开的通道
FL_ADC_EnableSequencerChannel(ADC, FL_ADC_INTERNAL_TS); //通道选择
FL_ADC_ClearFlag_EndOfConversion(ADC); //清标志
FL_ADC_Enable(ADC); //启动ADC
FL_ADC_EnableSWConversion(ADC); //开始转换
do
{
EOC_Flag = FL_ADC_IsActiveFlag_EndOfConversion(ADC);
counter++;
} while((counter != 0xFFFFFFFFU) && (EOC_Flag == 0U)); //等待转换完成
if(EOC_Flag == 0x01U)
{
FL_ADC_ClearFlag_EndOfConversion(ADC); //清标志
*ADCRdresult = FL_ADC_ReadConversionData(ADC); //获取采样值
FL_ADC_Disable(ADC); //关闭ADC
FL_ADC_DisableSequencerChannel(ADC, FL_ADC_INTERNAL_TS); //通道关闭
State = 0;
}
else
{
State = 1 ;
}
return State;
}
用DMA也会出现这种情况,但是AVREF不受影响。。。。 yyyyyyyy 发表于 2023-4-21 17:49
用DMA也会出现这种情况,但是AVREF不受影响。。。。
一个是采集电压通道,一个是采集温度通道。不是同一个通道。你怎么做的比较。 顾博文 发表于 2023-4-25 16:43
一个是采集电压通道,一个是采集温度通道。不是同一个通道。你怎么做的比较。...
就是用上面两种方式分别对TS与AVREF两个通道进行采集,结果AVREF用两种方式得到的值是一样的,但是TS不一样 yyyyyyyy 发表于 2023-4-25 20:34
就是用上面两种方式分别对TS与AVREF两个通道进行采集,结果AVREF用两种方式得到的值是一样的,但是TS不一 ...
你是不是 ms_config.c 里的adc初始化配置不一样。 例程的算出温度对不对,如果对就按例程去配。例程的主频是8M,你如果跑高速,adc的预分频按比例加。
页:
[1]