OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3997|回复: 8

STM32L031K6T6 ADC转换,发现每次启动adc转换,adcIO电平就会抖动,导致采样有误差,请大神帮忙!!!

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-1-25
在线时间
12 小时
发表于 2018-1-25 18:09:04 | 显示全部楼层 |阅读模式
1金钱
adc采样IO对地接一个电阻,电路图如下附件,K7,K8悬空,这时候启动AD转换,PA0口转换值为0,PA1口转换值为100左右,



程序如下:
ADC_HandleTypeDef ADC1_Handler;
//功能:ADC初始化
void ADC1_Init(void)
{
          ADC1_Handler.Instance = ADC1;

  ADC1_Handler.Init.OversamplingMode      = DISABLE;

  ADC1_Handler.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV4;
  ADC1_Handler.Init.LowPowerAutoPowerOff  = DISABLE;
  ADC1_Handler.Init.LowPowerFrequencyMode = ENABLE;
  ADC1_Handler.Init.LowPowerAutoWait      = DISABLE;

  ADC1_Handler.Init.Resolution            = ADC_RESOLUTION_12B;
  ADC1_Handler.Init.SamplingTime          = ADC_SAMPLETIME_19CYCLES_5;
  ADC1_Handler.Init.ScanConvMode          = ADC_SCAN_DIRECTION_FORWARD;
  ADC1_Handler.Init.DataAlign             = ADC_DATAALIGN_RIGHT;
  ADC1_Handler.Init.ContinuousConvMode    = ENABLE;
  ADC1_Handler.Init.DiscontinuousConvMode = DISABLE;
  ADC1_Handler.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE;
  ADC1_Handler.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;
  ADC1_Handler.Init.DMAContinuousRequests = DISABLE;
       
        HAL_ADC_Init(&ADC1_Handler);


        HAL_ADCEx_Calibration_Start(&ADC1_Handler, ADC_SINGLE_ENDED);//ADC自动校准
       
}

void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        if(hadc->Instance==ADC1)
        {
                __HAL_RCC_ADC1_CLK_ENABLE();
                __HAL_RCC_GPIOA_CLK_ENABLE();

                GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_6|GPIO_PIN_7;
                GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
                GPIO_InitStruct.Pull = GPIO_NOPULL;
                HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
        }
}

void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
{
        if(hadc->Instance==ADC1)
        {
                __HAL_RCC_ADC1_CLK_DISABLE();
                HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_6|GPIO_PIN_7);
        }
}

//功能:获取ADC转换值
//参数:ch通道(ADC_CHANNEL_0),num 采样次数
//返回值:num次采样的平均数
u16 Get_Adc(u32 ch,u8 num)
{
        u16 Value=0,t;
        u32 sum=0;
        u8 i=0;
        u8 count=0;
        ADC_ChannelConfTypeDef ADC1_ChanConf;

        ADC1->CHSELR = (u32)0x00000000;                        //清空配置通道寄存器
        ADC1_ChanConf.Channel= ch;         //配置通道
        ADC1_ChanConf.Rank=ADC_RANK_CHANNEL_NUMBER; //启用所选通道的序列
        HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf); //通道配置
        HAL_ADC_Start(&ADC1_Handler);         //开启AD,开启AD的时候会清除标志HAL_ADC_STATE_REG_EOC
        delay_ms(200);
        for(i=0;i<num+1;i++)
        {
                HAL_ADC_PollForConversion(&ADC1_Handler,10);  //等待轮询转换 超时10ms
                if ((HAL_ADC_GetState(&ADC1_Handler) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)
                {
                       
                        t = HAL_ADC_GetValue(&ADC1_Handler);
                        if(i!=0){printf("-%d-",t);sum+=t;count++;}
                }
        }
        HAL_ADC_Stop(&ADC1_Handler);         //开启AD,开启AD的时候会清除标志HAL_ADC_STATE_REG_EOC
        Value = sum/count;//多次转换求和取平均数
        printf("ADC通道采样成功的次数:%d  ",count);
        printf("ADC通道采样的平均值: %d \r\n",Value);
        return Value; //返回最近转换结果
}




主函数循环打印:
                printf("ADC_ADC_CHANNEL_0_Value= %d\r\n",Get_Adc(ADC_CHANNEL_0,10));
                delay_ms(100);
                printf("ADC_ADC_CHANNEL_1_Value= %d\r\n",Get_Adc(ADC_CHANNEL_1,10));
                delay_ms(100);


转换有毛刺.jpg

AD没有启动转换

AD没有启动转换

原理图

原理图
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-1-25
在线时间
12 小时
 楼主| 发表于 2018-1-25 18:11:28 | 显示全部楼层
回复

使用道具 举报

7

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2017-4-6
在线时间
67 小时
发表于 2018-1-25 18:33:04 | 显示全部楼层
IO口加一个1nF到地,做滤波看看
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-1-25
在线时间
12 小时
 楼主| 发表于 2018-1-26 09:50:43 | 显示全部楼层
JUSTNIUB 发表于 2018-1-25 18:33
IO口加一个1nF到地,做滤波看看

加过0.1uF的,效果不是很明显
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-1-25
在线时间
12 小时
 楼主| 发表于 2018-1-26 09:51:11 | 显示全部楼层
lovewa 发表于 2018-1-26 09:50
加过0.1uF的,效果不是很明显

都是每次启动转换的时候出现的
回复

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2018-1-26
在线时间
3 小时
发表于 2018-1-26 10:00:51 | 显示全部楼层
我也有这个问题
回复

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2018-1-26
在线时间
3 小时
发表于 2018-1-26 10:01:10 | 显示全部楼层
通道之间相互影响,还没有找到问题在哪
回复

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2018-1-26
在线时间
3 小时
发表于 2018-1-26 10:04:46 | 显示全部楼层
回复

使用道具 举报

72

主题

245

帖子

0

精华

高级会员

Rank: 4

积分
510
金钱
510
注册时间
2015-11-13
在线时间
131 小时
发表于 2018-3-8 10:29:55 | 显示全部楼层
楼主用cube配置ADC需要给它配置中断吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-11 12:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表