摇杆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:08 编辑
你用的什么摇杆?是工业级的吗?
一般的遥杆零位偏差很大,这种时候得用动态校准。如果在正常工作中,一段时间内(比如10秒)的值在中间位置附件,并且变化幅度不太大的话,认为是机械零位。人手操作是很难保持10秒内位置不变化的。
怀疑AD有问题的话,那么接个电位器或电阻分压,来测个固定电压,看看还变化大不大,不要用遥杆。
建议你把STM32内部温度传感器和内部参考电压,也采一下,跟你的外部AD通道数据做一下对比。看一下变化趋势,内部温度会随着通电时间会慢慢变大一些,但是内部参考电压是应该变的,即使变也会很小。如果变化大,那就是你外部AD参考电压或电源电压有变化。
你这里的ADC复位是ADC自校准吗,STM32的ADC支持自校准的,楼主可以试试。另外ADC的负载电阻比较大,可以看做开路,最好通过电阻分压的方式提供一个从通道到GND的泄放通路,这样会稳定一些 xmstudio 发表于 2018-3-13 15:26
你这里的ADC复位是ADC自校准吗,STM32的ADC支持自校准的,楼主可以试试。另外ADC的负载电阻比较大,可以看 ...
完全听不懂:(请问这个具体应该怎么做呢? toofree 发表于 2018-3-13 10:03
你用的什么摇杆?是工业级的吗?
一般的遥杆零位偏差很大,这种时候得用动态校准。如果在正常工作中,一段 ...
你好,,用的是淘宝上4块左右的摇杆。。。 miracle533 发表于 2018-3-13 18:15
你好,,用的是淘宝上4块左右的摇杆。。。
那先排除AD的问题吧,这个摇杆归零不好。 toofree 发表于 2018-3-13 18:24
那先排除AD的问题吧,这个摇杆归零不好。
其实一直对这点很疑惑:我用的是ADC的两个通道,看视频我理解的时应该开启扫描模式和连续转换模式,但是现在2个都没有开,2个通道却一直有数据。 miracle533 发表于 2018-3-13 18:10
完全听不懂请问这个具体应该怎么做呢?
ADC自校准在HAL库里面有
HAL_ADCEx_Calibration_Start(&hadc1);
电阻分压的接法就是这样
这样就算ADC那边算作开路,在Vin电压变化时,电荷可以通过电阻流到地,不会积累在ADC那里
xmstudio 发表于 2018-3-13 21:44
ADC自校准在HAL库里面有
电阻分压的接法就是这样
你好,我没有接触过这种图,学硬件的能不能看懂这个呢?我让学硬件的帮我看一下这个图。。:handshake miracle533 发表于 2018-3-13 22:07
你好,我没有接触过这种图,学硬件的能不能看懂这个呢?我让学硬件的帮我看一下这个图。。 ...
VIN就是你需要用AD采集的电压,ADC就是你选择的ADC输入引脚,最下面那个就是GND引脚
页:
[1]
2