设为首页
收藏本站
玩玩魔方
登录
|
立即注册
我的中心
提醒
设置
退出
搜索
搜索
本版
用户
门户
Portal
样片申请
低功耗嵌入式软件开发者论坛
»
论坛
›
技术交流分享
›
FM33LG0xx系列
›
ADC 内部温度通道 采样不准确
返回列表
发新帖
查看:
4956
|
回复:
4
ADC 内部温度通道 采样不准确
[复制链接]
wangcharley
wangcharley
当前离线
积分
485
41
主题
59
帖子
485
积分
高级工程师
高级工程师, 积分 485, 距离下一级还需 15 积分
高级工程师, 积分 485, 距离下一级还需 15 积分
积分
485
收听TA
发消息
发表于 2023-2-25 15:55:30
|
显示全部楼层
|
阅读模式
adc 通道14 采样正常,内部温度采样输出不正确,仿真的时候看,每次获取的采样值差别就很大,使用查询方式的时候就正常,是温度只能用查询的方式获取吗???
/**
* @brief ADC_Common Initialization function
* @param void
* @retval None
*/
void MF_ADC_Common_Init(void)
{
FL_ADC_CommonInitTypeDef Common_InitStruct;
Common_InitStruct.clockSource = FL_CMU_ADC_CLK_SOURCE_RCHF;
Common_InitStruct.clockPrescaler = FL_ADC_CLK_PSC_DIV8;
Common_InitStruct.referenceSource = FL_ADC_REF_SOURCE_VDDA;
Common_InitStruct.bitWidth = FL_ADC_BIT_WIDTH_12B;
FL_ADC_CommonInit(&Common_InitStruct);
}
复制代码
/**
* @brief ADC_Sampling Initialization function
* @param void
* @retval None
*/
void MF_ADC_Sampling_Init(void)
{
FL_GPIO_InitTypeDef GPIO_InitStruct;
FL_ADC_InitTypeDef Sampling_InitStruct;
/* PC9 ADC_IN14 */
GPIO_InitStruct.pin = FL_GPIO_PIN_9;
GPIO_InitStruct.mode = FL_GPIO_MODE_ANALOG;
GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.pull = FL_DISABLE;
GPIO_InitStruct.remapPin = NULL;
GPIO_InitStruct.analogSwitch = FL_DISABLE;
FL_GPIO_Init(GPIOC, &GPIO_InitStruct);
Sampling_InitStruct.conversionMode = FL_ADC_CONV_MODE_SINGLE;
Sampling_InitStruct.autoMode = FL_ADC_SINGLE_CONV_MODE_AUTO;
Sampling_InitStruct.waitMode = FL_ENABLE;
Sampling_InitStruct.overrunMode = FL_ENABLE;
Sampling_InitStruct.scanDirection = FL_ADC_SEQ_SCAN_DIR_FORWARD;
Sampling_InitStruct.externalTrigConv = FL_ADC_TRIGGER_EDGE_NONE;
Sampling_InitStruct.triggerSource = FL_DISABLE;
Sampling_InitStruct.fastChannelTime = FL_ADC_FAST_CH_SAMPLING_TIME_2_ADCCLK;
Sampling_InitStruct.lowChannelTime = FL_ADC_SLOW_CH_SAMPLING_TIME_512_ADCCLK;
Sampling_InitStruct.oversamplingMode = FL_ENABLE;
Sampling_InitStruct.overSampingMultiplier = FL_ADC_OVERSAMPLING_MUL_16X;
Sampling_InitStruct.oversamplingShift = FL_ADC_OVERSAMPLING_SHIFT_4B;
FL_ADC_Init(ADC, &Sampling_InitStruct);
FL_ADC_EnableSequencerChannel(ADC, FL_ADC_INTERNAL_TS);
FL_ADC_EnableSequencerChannel(ADC, FL_ADC_INTERNAL_VREF1P2);
// FL_ADC_EnableSequencerChannel(ADC, FL_ADC_EXTERNAL_CH14);
}
复制代码
/**
* @brief ADC Interrupt Initialization function
* @param void
* @retval None
*/
void MF_ADC_Interrupt_Init(void)
{
FL_ADC_ClearFlag_EndOfConversion(ADC);
FL_ADC_EnableIT_EndOfConversion(ADC);
}
/**
* @brief NVIC Initialization function
* @param void
* @retval None
*/
static void MF_NVIC_Init(void)
{
FL_NVIC_ConfigTypeDef InterruptConfigStruct;
InterruptConfigStruct.preemptPriority = 0x2; /*配置中断优先级*/
FL_NVIC_Init(&InterruptConfigStruct, ADC_IRQn);
}
复制代码
uint32_t GetSingleChannelVoltage_IT(void)
{
uint32_t GetChannelVoltage = 0;
if(VREF1P2ChannelSample != 0)
{
GetChannelVoltage = (uint32_t)(((uint64_t)ExChannelSample * 3000 * (ADC_VREF)) / ((uint64_t)VREF1P2ChannelSample * 4095));
}
// 转换结果
return GetChannelVoltage;
}
float GetTS_IT(void)
{
uint32_t VPTAT = 0, VPTAT_30 = 0;
float GetTS = 0.00f;
if(VREF1P2ChannelSample != 0)
{
VPTAT = (uint32_t)(((uint64_t)GetTSChannelSample * 3000 * (ADC_VREF)) / ((uint64_t)VREF1P2ChannelSample * 4095));
VPTAT_30 = ((uint32_t)ADC_TS * 3000) / (4095);
GetTS = ((float)VPTAT - (float)VPTAT_30) / (2.6f) + (30.0f);
}
// 转换结果
return GetTS;
}
复制代码
回复
使用道具
举报
EvensYin
EvensYin
当前离线
积分
51
3
主题
10
帖子
51
积分
中级工程师
中级工程师, 积分 51, 距离下一级还需 149 积分
中级工程师, 积分 51, 距离下一级还需 149 积分
积分
51
收听TA
发消息
发表于 2024-6-28 16:48:13
|
显示全部楼层
请问一下,这个问题的原因找到了吗,大佬;我也遇到了同样的问题,ADC外部通道采样挺准的,使用ADC内部温度采样(ADC单端+中断)无法采集到一个稳定的值
回复
使用道具
举报
EvensYin
EvensYin
当前离线
积分
51
3
主题
10
帖子
51
积分
中级工程师
中级工程师, 积分 51, 距离下一级还需 149 积分
中级工程师, 积分 51, 距离下一级还需 149 积分
积分
51
收听TA
发消息
发表于 2024-6-28 16:49:47
|
显示全部楼层
大佬,问一下,原因找到了吗,我使用ADC单端采样+中断也是一样的问题,采不到一个稳定的值
回复
使用道具
举报
EvensYin
EvensYin
当前离线
积分
51
3
主题
10
帖子
51
积分
中级工程师
中级工程师, 积分 51, 距离下一级还需 149 积分
中级工程师, 积分 51, 距离下一级还需 149 积分
积分
51
收听TA
发消息
发表于 2024-7-2 09:55:42
|
显示全部楼层
大佬,这个问题你解决了吗,我也遇到一样的问题
回复
使用道具
举报
EvensYin
EvensYin
当前离线
积分
51
3
主题
10
帖子
51
积分
中级工程师
中级工程师, 积分 51, 距离下一级还需 149 积分
中级工程师, 积分 51, 距离下一级还需 149 积分
积分
51
收听TA
发消息
发表于 2024-7-30 17:17:45
|
显示全部楼层
这个问题的解决方案如下:
在使用ADC+中断进行ADC内部温度采样的前,要开启VERF的使能设置,才可以采样准确;
FL_CMU_SetADCPrescaler(FL_CMU_ADC_PSC_DIV2); //配置ADC工作时钟分频
FL_VREF_EnableVREFBuffer(VREF); //使能VREF BUFFER
FL_ADC_DisableSequencerChannel(ADC, FL_ADC_ALL_CHANNEL); //清空打开的通道
FL_ADC_EnableSequencerChannel(ADC, FL_ADC_INTERNAL_VREF1P2); //通道选择VREF
FL_ADC_ClearFlag_EndOfConversion(ADC); //清标志
FL_ADC_Enable(ADC); // 启动ADC
FL_ADC_EnableSWConversion(ADC); // 开始转换
回复
使用道具
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
浏览过的版块
电力相关
FM33A0xx系列
快速回复
返回顶部
返回列表