OpenEdv-开源电子网

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

STM32F103CBT6的ADC输出值非线性跳跃问题,请大侠们帮忙。

[复制链接]

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2014-10-10
在线时间
6 小时
发表于 2014-10-18 22:37:04 | 显示全部楼层 |阅读模式
5金钱
搞了一天的ADC DMA单通道模式数据采集,最后才发现一个致命的问题,两块板子都是一模一样的问题,简单的电阻分压送给ADC采集,,更换元件参数问题依旧,至此基本排除硬件电路的问题。
测试方法输入一个线性电压经过电阻分压送给ADC,0-4V步进0.1V,得到一个对应的ADC输出值。
可以观察到,7x 17x 27x 等输出值都是一下子跳到100 200 300的。


[mw_shl_code=c,true]#include "stm32f10x.h" #define ADC1_DR_Address ((uint32_t)0x4001244C) ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; __IO u16 AD_Value[30] = {0}; //AD采样值 __IO u16 After_filter[1] = {0}; //AD滤波后 void gpio_cfg(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); } void rcc_cfg(void) { RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE); } void delay(unsigned int t) { while( t>0 ) t--; } int GetVolt(u16 advalue) { return (advalue * 50 / 4096); } int x,y; int main(void) { rcc_cfg(); gpio_cfg(); /* DMA1 channel1 configuration ----------------------------------------------*/ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&AD_Value; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 30; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* Enable DMA1 channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE); DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE); //使能DMA传输完成中断 /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); RCC_ADCCLKConfig(RCC_PCLK2_Div8); /* ADC1 regular channel14 configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_239Cycles5); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 reset calibration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);// Enable the DMA Interrupt while (1) { x = GetVolt(After_filter[0]); y = AD_Value[0]; } } [/mw_shl_code]
现在怀疑两个方向可能出现问题,程序和芯片本身,程序是按照固件库例程修改的,多次查找未找到可能引起这种现象的代码,难道单片机本身有缺陷?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-18 23:32:16 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2014-10-10
在线时间
6 小时
 楼主| 发表于 2014-10-19 08:48:30 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥你看为啥adc的输出值会从70一下子跳到100,而且这区间的电压值都分辨不出,几乎是没有线性度可言。
回复

使用道具 举报

52

主题

142

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2013-10-17
在线时间
23 小时
发表于 2014-10-19 12:45:29 | 显示全部楼层
你确定电压可以输到4V =  =
回复

使用道具 举报

52

主题

142

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2013-10-17
在线时间
23 小时
发表于 2014-10-19 12:48:27 | 显示全部楼层
你输入的切换频率多少?  采样保持时间呢?
回复

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2014-10-10
在线时间
6 小时
 楼主| 发表于 2014-10-19 15:06:44 | 显示全部楼层
回复【4楼】The_Professo_Lee:
---------------------------------
仔细看帖,输入经电阻分压。
回复

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2014-10-10
在线时间
6 小时
 楼主| 发表于 2014-10-19 15:07:49 | 显示全部楼层
回复【5楼】The_Professo_Lee:
---------------------------------
找到点头绪,ADC寄存器数值没有任何问题,错误出在经DMA传输后。
回复

使用道具 举报

11

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2014-8-22
在线时间
0 小时
发表于 2014-11-4 09:22:44 | 显示全部楼层
回复【7楼】mikeliran:
---------------------------------
可以具体讲讲吗?我用多通道采集模拟电压值传输给USB鼠标使用也出现了类似现象,请问解决了吗?
回复

使用道具 举报

8

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2013-11-29
在线时间
7 小时
发表于 2014-11-4 16:00:31 | 显示全部楼层
大神你是怎么把AD数据导入到表格中的?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-29 19:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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