STM32
直播中

史晓明

7年用户 922经验值
私信 关注
[问答]

STM32F0R8T6定时器预分频配置影响AD采样值,为什么?

今天碰到一个奇怪的问题,开了tiM17的100ms中断,预分频99,发现以前正常采样电位器值的AD数据错误,明明是12位的AD通过调试查看变量发现采样到了6000多的值,但把预分频改为8以下则立马一切正常,我就纳闷了,两个完全不相关的配置怎么会影响,AD为DMA模式

#include "STM32f0xx.h"

uint16_t ADC_ConvertedValue;  //ADC转换值



void ADC_Config(void)
{

   

}


int main(void)
{
    TIM_TimeBaseInitTypeDef a;  //定时器配置结构体
    ADC_InitTypeDef ADC_InitStructure;  //ADC配置结构体

    a.TIM_Prescaler=0;  //定时器预分频(定时器时钟频率=晶振频率/(TIM_Prescaler+1))

   
    ADC_Config();
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  //开启ADC时钟


    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  //设置选择连续采样
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  //采样数据右对齐

    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;  //ADC外部边缘触发无效
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;  // 配置ADC转换分辨率 12bit
    ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward;  //设置ADC扫描方向
    ADC_Init(ADC1,  ADC_InitStructure);  //配置ADC

    ADC_ChannelConfig(ADC1, ADC_Channel_0, ADC_SampleTime_239_5Cycles);  //配置ADC通道与采样周期

    ADC_Cmd(ADC1, ENABLE);  //启动ADC1

    ADC_StartOfConversion(ADC1);  //软件触发ADC启动转换


    while (1)
    {
        ADC_ConvertedValue=ADC_GetConversionValue(ADC1);
    }





回帖(1)

贾小龙

2024-5-15 16:55:16
STM32F0R8T6定时器预分频配置影响AD采样值的原因可能是由于定时器中断和ADC采样之间的时序关系。在您的代码中,您使用了TIM17定时器的100ms中断,预分频为99。当预分频设置为较高的值时,定时器的计数周期变长,可能导致ADC采样的时序受到影响。

以下是可能的解释:

1. 当定时器预分频设置为99时,定时器的计数周期变长,可能导致ADC采样的触发时机发生变化。这可能导致ADC采样到错误的模拟信号值,从而导致采样值异常。

2. 由于STM32F0R8T6的ADC和定时器共享某些硬件资源,例如DMA通道,当定时器预分频设置较高时,可能会影响DMA传输的时序,从而导致ADC采样值异常。

为了解决这个问题,您可以尝试以下方法:

1. 调整定时器预分频值,使其在较低的范围内,以减少对ADC采样时序的影响。

2. 检查ADC采样的触发方式,确保它与定时器中断无关。您可以使用其他触发方式,如外部事件或软件触发。

3. 确保DMA传输的配置正确,以避免与定时器中断产生冲突。

4. 如果可能,尝试使用另一个定时器或ADC通道,以避免潜在的硬件冲突。

5. 在调试过程中,使用示波器或逻辑分析仪检查ADC采样和定时器中断的时序关系,以确定问题的根本原因。

希望这些建议能帮助您解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分