miracle533 发表于 2018-3-13 09:40:49

摇杆ADC采集数据

本人想用摇杆控制电机的正反转,摇杆有2个通道,通过串口显示摇杆在中间位置时,2个通道的数据不一样(如果摇杆在中间位置的话2个通道的数据应该是一样的吧。)。2个通道都先去掉了最大值最小值,然后求出平均值,最后返回数据。但是过一段时间数据就会有较大的变化(如从原来的50慢慢增大到60),想问一下这个是什么情况。。。
下面是对ADC的设置
voidADC_Configuration(void)
{   
GPIO_InitTypeDefGPIO_InitStructure;
        ADC_CommonInitTypeDef ADC_CommonInitStructure;
        ADC_InitTypeDef       ADC_InitStructure;
       
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟

//先初始化ADC1通道5 IO口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PA5 通道5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//PA5 通道5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化


        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);          //ADC1复位
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);        //复位结束       

       
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟5个时钟
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMA关闭
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//预分频4分频。ADCCLK=PCLK2/4=84/4=21Mhz,ADC时钟最好不要超过36Mhz
ADC_CommonInit(&ADC_CommonInitStructure);//初始化
       
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式       
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐       
ADC_InitStructure.ADC_NbrOfConversion = 1;//1个转换在规则序列中 也就是只转换规则序列1
ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
       

        ADC_Cmd(ADC1, ENABLE);//开启AD转换器       

}       

toofree 发表于 2018-3-13 10:03:48

本帖最后由 toofree 于 2018-3-13 10:08 编辑

你用的什么摇杆?是工业级的吗?
一般的遥杆零位偏差很大,这种时候得用动态校准。如果在正常工作中,一段时间内(比如10秒)的值在中间位置附件,并且变化幅度不太大的话,认为是机械零位。人手操作是很难保持10秒内位置不变化的。

怀疑AD有问题的话,那么接个电位器或电阻分压,来测个固定电压,看看还变化大不大,不要用遥杆。

建议你把STM32内部温度传感器和内部参考电压,也采一下,跟你的外部AD通道数据做一下对比。看一下变化趋势,内部温度会随着通电时间会慢慢变大一些,但是内部参考电压是应该变的,即使变也会很小。如果变化大,那就是你外部AD参考电压或电源电压有变化。

xmstudio 发表于 2018-3-13 15:26:22

你这里的ADC复位是ADC自校准吗,STM32的ADC支持自校准的,楼主可以试试。另外ADC的负载电阻比较大,可以看做开路,最好通过电阻分压的方式提供一个从通道到GND的泄放通路,这样会稳定一些

miracle533 发表于 2018-3-13 18:10:55

xmstudio 发表于 2018-3-13 15:26
你这里的ADC复位是ADC自校准吗,STM32的ADC支持自校准的,楼主可以试试。另外ADC的负载电阻比较大,可以看 ...

完全听不懂:(请问这个具体应该怎么做呢?

miracle533 发表于 2018-3-13 18:15:15

toofree 发表于 2018-3-13 10:03
你用的什么摇杆?是工业级的吗?
一般的遥杆零位偏差很大,这种时候得用动态校准。如果在正常工作中,一段 ...

你好,,用的是淘宝上4块左右的摇杆。。。

toofree 发表于 2018-3-13 18:24:28

miracle533 发表于 2018-3-13 18:15
你好,,用的是淘宝上4块左右的摇杆。。。

那先排除AD的问题吧,这个摇杆归零不好。

miracle533 发表于 2018-3-13 20:45:13

toofree 发表于 2018-3-13 18:24
那先排除AD的问题吧,这个摇杆归零不好。

其实一直对这点很疑惑:我用的是ADC的两个通道,看视频我理解的时应该开启扫描模式和连续转换模式,但是现在2个都没有开,2个通道却一直有数据。

xmstudio 发表于 2018-3-13 21:44:47

miracle533 发表于 2018-3-13 18:10
完全听不懂请问这个具体应该怎么做呢?

ADC自校准在HAL库里面有
HAL_ADCEx_Calibration_Start(&hadc1);
电阻分压的接法就是这样

这样就算ADC那边算作开路,在Vin电压变化时,电荷可以通过电阻流到地,不会积累在ADC那里

miracle533 发表于 2018-3-13 22:07:52

xmstudio 发表于 2018-3-13 21:44
ADC自校准在HAL库里面有

电阻分压的接法就是这样


你好,我没有接触过这种图,学硬件的能不能看懂这个呢?我让学硬件的帮我看一下这个图。。:handshake

xmstudio 发表于 2018-3-13 23:36:51

miracle533 发表于 2018-3-13 22:07
你好,我没有接触过这种图,学硬件的能不能看懂这个呢?我让学硬件的帮我看一下这个图。。 ...

VIN就是你需要用AD采集的电压,ADC就是你选择的ADC输入引脚,最下面那个就是GND引脚
页: [1] 2
查看完整版本: 摇杆ADC采集数据