[求助] STM32F767AD采样严重不准的问题

chenbingjy   2018-10-19 08:35 楼主
我写了一个STM32F767AD采样的程序。
我测了一下,AD口(PF4)那儿只有0.几V,可是采样值很大0x3c8,0x3cb。
程序如下:
int main(void)
{
        u8 i;

        float temp;
    Cache_Enable();                 //打开L1-Cache
    HAL_Init();                                        //初始化HAL库
    Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz
    delay_init(216);                //延时初始化
        uart_init(115200);                        //串口初始化
    LED_Init();                     //初始化LED

    SDRAM_Init();                   //初始化SDRAM

    MY_ADC_Init();                  //初始化ADC1通道5

                 
    while(1)
        {
        adcx=Get_Adc_Average(ADC_CHANNEL_14,20);//获取通道5的转换值,20次取平均
                i=8;
                delay_ms(5);
        }
}


以上是主程序。
ADC_HandleTypeDef ADC3_Handler;//ADC句柄

//初始化ADC
//ch: ADC_channels
//通道值 0~16取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
void MY_ADC_Init(void)
{
    ADC3_Handler.Instance=ADC3;
    ADC3_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频,ADCCLK=PCLK2/4=108/4=27MHZ
    ADC3_Handler.Init.Resolution=ADC_RESOLUTION_12B;             //12位模式
    ADC3_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT;             //右对齐
    ADC3_Handler.Init.ScanConvMode=DISABLE;                      //非扫描模式
    ADC3_Handler.Init.EOCSelection=DISABLE;                      //关闭EOC中断
    ADC3_Handler.Init.ContinuousConvMode=DISABLE;                //关闭连续转换
    ADC3_Handler.Init.NbrOfConversion=1;                         //1个转换在规则序列中 也就是只转换规则序列1
    ADC3_Handler.Init.DiscontinuousConvMode=DISABLE;             //禁止不连续采样模式
    ADC3_Handler.Init.NbrOfDiscConversion=0;                     //不连续采样通道数为0
    ADC3_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START;       //软件触发
    ADC3_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE;//使用软件触发
    ADC3_Handler.Init.DMAContinuousRequests=DISABLE;             //关闭DMA请求
    HAL_ADC_Init(&ADC3_Handler);                                 //初始化
}

//ADC底层驱动,引脚配置,时钟使能
//此函数会被HAL_ADC_Init()调用
//hadc:ADC句柄
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
    GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_ADC3_CLK_ENABLE();            //使能ADC1时钟
    __HAL_RCC_GPIOF_CLK_ENABLE();                        //开启GPIOA时钟
        
    GPIO_Initure.Pin=GPIO_PIN_4;            //PA5
    GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟
    GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉
    HAL_GPIO_Init(GPIOF,&GPIO_Initure);
}

//获得ADC值
//ch: 通道值 0~16,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
//返回值:转换结果
u16 Get_Adc(u32 ch)   
{
    ADC_ChannelConfTypeDef ADC3_ChanConf;

    ADC3_ChanConf.Channel=ch;                                   //通道
    ADC3_ChanConf.Rank=1;                                       //1个序列
    ADC3_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES;        //采样时间
    ADC3_ChanConf.Offset=0;                 
    HAL_ADC_ConfigChannel(&ADC3_Handler,&ADC3_ChanConf);        //通道配置
        
    HAL_ADC_Start(&ADC3_Handler);                               //开启ADC
        
    HAL_ADC_PollForConversion(&ADC3_Handler,10);                //轮询转换

        return (u16)HAL_ADC_GetValue(&ADC3_Handler);                    //返回最近一次ADC1规则组的转换结果
}
//获取指定通道的转换值,取times次,然后平均
//times:获取次数
//返回值:通道ch的times次转换结果平均值
u16 Get_Adc_Average(u32 ch,u8 times)
{
        u32 temp_val=0;
        u8 t;
        for(t=0;t
        {
                temp_val+=Get_Adc(ch);
                delay_ms(5);
        }
        return temp_val/times;
}

以上是AD程序。 5.jpg


请大神给我看看,哪儿有问题?谢谢!
为江山踏坏了乌骓马,为社稷拉断了宝雕弓。

回复评论 (3)

还有一个问题。AD原理图如下:
1.jpg
接上传感器以后,AD1,AD3都大约是0.7V。
如果只接一个,比如接在U5上,AD1大约0.7V,可是U7出来的
电压值竟然是1.32V。请问高手,这是怎么回事啊?谢谢!
为江山踏坏了乌骓马,为社稷拉断了宝雕弓。
点赞  2018-10-19 09:20
点赞  2018-10-22 09:18
请问楼主解决了吗
点赞  2024-5-9 10:27
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复