你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103VE AD转换跨界问题

[复制链接]
skyfulstar 提问时间:2011-12-13 16:47 /
 用STM32进行4通道ADC转换,采用DMA方式。基准源为2500mv,12位AD采样, 采样电压使用范围为120-750mv,经测试在三段内出现非常大采样误差,大约分别是154-164mv,308-318mv,620-630mv;其他范围采样非常好,经过分析发现这三个段正好在跨在AD进位点,155mv--255(2^8),312mv--512(2^9),625mv--1024(2^10)这三个点。
155mv附近测试数据如下:
处理器采样结果                万用表测量结果
145.16                                143.75
149.15                             147.76
151.42                                150.21
153.75                                152.52
155.04                                154.9
155.36                                155.73
155.59                                157.75
155.64                                159.23
155.78                                161.14
156.21                                161.68
157.36                                162.7
159.89                                163.86
163.24                                164.73
166.05                                165.57
167.78                                166.42
 
误差就出现在,电压在154-164mv范围内采样出的电平都在停止不前(或者说增加变缓),直到电压达到166时,采样恢复正常。其他2个点都是这种情况。
请问有哪位高手给指导下,问题出现在哪儿?我换过通道口没有改善,电压信号原来是由传感器产生,后面改由电位器调节出电平无改善。采样时间修改无改善,测量通道修改为1无改善。换处理器103VE、103VC、107VC无改善
收藏 评论19 发布时间:2011-12-13 16:47

举报

19个回答
火雷达 回答时间:2011-12-13 21:40:38

回复:STM32F103VE AD转换跨界问题

你说的这种情况,还真没有遇到过,你可以看看你的RC电路的参数,是不是这个原因。
1、你用一个通道来测量,不用DMA方式,看看是否出现这种情况。先确定是硬件的问题还是软件的问题。
2、看看输出的AD值是否正常,不要处理AD值,看原始的AD值。
废鱼 回答时间:2011-12-13 21:43:01

RE:STM32F103VE AD转换跨界问题

如果你要的精度很高的话,光万用表采集的不准确,还是用精度高的可调电源测试。
废鱼 回答时间:2011-12-13 21:45:53

RE:STM32F103VE AD转换跨界问题

如果想要采集的经度高的话,首先要注意几个问题:
1、如果用到分压,最好使用放大器来处理,并且分压电阻的精度要高;
2、万用表的精度也很重要,他不一定比你MCU采集的精度高;
3、测试的时候,电源的使用也很重要,要考虑使用精度高的可调电源。
skyfulstar 回答时间:2011-12-14 12:03:48

回复:STM32F103VE AD转换跨界问题

回复第 2 楼 于2011-12-13 13:40:38发表:
你说的这种情况,还真没有遇到过,你可以看看你的RC电路的参数,是不是这个原因。
1、你用一个通道来测量,不用DMA方式,看看是否出现这种情况。先确定是硬件的问题还是软件的问题。
2、看看输出的AD值是否正常,不要处理AD值,看原始的AD值。 

单通道测量过,没改善,并且我使用过例程程序单通道,单值一秒读一次数,只看AD值,会出现在255处出现不增长的情况(当然波动是存在的,我说的不增长是指多数概率出现255而不是正确的大于255的AD值),之前只发现155mv和625mv两个点不好,就因为是看AD值才发现测出的点正好跨在AD进位点上,我才推断出512的点(即312mv)也可能有误差,结果验证后真是如此。
软件换过多种办法没什么改善,硬件换过处理器,还换过另外一种板子,没改善。所以到底是软件或硬件问题我也没弄清除。
skyfulstar 回答时间:2011-12-14 12:21:19

RE:STM32F103VE AD转换跨界问题

现在问题不在于采样精度,而在于采样的一致性,问题是在我使用的120-750mv范围内除提到的三个点附近外,其他范围一致性非常好,电压增加,AD采样值相应增加,万用表测量值相应增加,当然它们之间都是有偏差的,但总体增加的比例是对的。就是在AD值进位点出现了电压增加AD值(多数值)停止不前的情况,直到电压高到一定值,AD值会突变到正确的值上,之后就与电压按比例变化了。并且除误差段外其他范围的线性都很好。
废鱼 回答时间:2011-12-14 14:55:59

RE:STM32F103VE AD转换跨界问题

我认为是你程序处理的问题,你可以检查一下。当155mV的时候,AD寄存器的值应该是0x130,你可以把你AD寄存器的实际值输出来,再换算成电压试试。
skyfulstar 回答时间:2011-12-15 12:26:30

回复:STM32F103VE AD转换跨界问题

回复第 7 楼 于2011-12-14 06:55:59发表:
我认为是你程序处理的问题,你可以检查一下。当155mV的时候,AD寄存器的值应该是0x130,你可以把你AD寄存器的实际值输出来,再换算成电压试试。 

谢谢帮助,但AD满量程2500mv,12位AD,155mv时的AD值应为 155*4096/2500=253.952 (254),也就是0x00FE。我只所以发现是在跨界点就是因为把AD值之间输出来才发现的。
 
skyfulstar 回答时间:2011-12-15 12:54:31

回复:STM32F103VE AD转换跨界问题

我的程序运行流程为,打开ADC和DMA,定时器3  10ms中断,每次中断把AD缓冲区ADCBUFLEN个数据求均值,之后把均值累加,达到ADCNUMMAX 次后,置位标志ADC_Result_OK,主循环检测标志ADC_Result_OK进入数据处理函数得到电平信号。意味着差不多1s获得一个平均电平值。具体程序如下
 
#define  ADC1_DR_Address    ((uint32)0x4001244C)
#define  ADCBUFLEN   2048    // ADC单通道数据缓冲区数据长度
#define  ADCBUFCHL   4     // ADC通道数
#define  ADCVREF    2500     // 参考电平为mV
#define  ADCNUMMAX    100     // ADC转换ADCBUFLEN次的次数
/*********************************************************************************************************
** 函数名称: DMA_Cfg
** 功能描述: 配置DMA
** 输   入: 无
** 输   出: 无
********************************************************************************************************/
void DMA_Cfg(void)
{
 DMA_InitTypeDef DMA_InitStructure;
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  // 使能DMA时钟
 // DMA配置
 DMA_DeInit(DMA1_Channel1);
 DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;  // DMA外设基地址
 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32)&ADC_Value_Buf; // DMA内存基地址
 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;    // DMA_DIR_PeripheralSRC 外设作为数据传输的来源; DMA_DIR_PeripheralDST 外设作为数据传输的目的地
 DMA_InitStructure.DMA_BufferSize = ADCBUFLEN*ADCBUFCHL;  // DMA缓存的大小,单位为数据单位
 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;// 外设地址寄存器不递增
 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;   // 内存地址寄存器递增
 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 外设数据宽度为16位
 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // 内存数据宽度为16位
 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;     // DMA_Mode_Circular 工作在循环缓存模式;DMA_Mode_Normal 工作在正常缓存模式
 DMA_InitStructure.DMA_Priority = DMA_Priority_High;    // DMA通道拥有高优先级
 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;     // 没有设置为内存到内存传输
 DMA_Init(DMA1_Channel1, &DMA_InitStructure);
 DMA_Cmd(DMA1_Channel1, ENABLE); // 使能DMA
}
skyfulstar 回答时间:2011-12-15 12:56:26

RE:STM32F103VE AD转换跨界问题

/*********************************************************************************************************
** 函数名称: GPIO_ADC_Cfg
** 功能描述: ADC引脚配置
** 输   入: 无
** 输   出: 无
********************************************************************************************************/
void GPIO_ADC_Cfg(void)
{
GPIO_InitTypeDef GPIO_InitStructure;   // 定义1个结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 打开GPIOX时钟

// 配置 PA0 PA1 PA2 PA3(ADC 通道 0 1 2 3)模拟输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*********************************************************************************************************
** 函数名称: ADC_Cfg
** 功能描述: 配置AD转换器
** 输   入: 无
** 输   出: 无
********************************************************************************************************/
void ADC_Cfg(void)
{
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // 使能ADC1时钟
//ADC1配置
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;     // 独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE;      // 扫描模式(多通道)
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;     // 连续模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 转换由软件触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;    // ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = ADCBUFCHL;     // 规定了顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure);
// ADC1规则模式通道配置
ADC_RegularChannelConfig(ADC1, ADC_Channel_0 , 1, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1 , 2, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_2 , 3, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_3 , 4, ADC_SampleTime_55Cycles5);
ADC_Cmd(ADC1, ENABLE);  // 使能ADC1
ADC_DMACmd(ADC1, ENABLE); // 使能ADC1 DMA功能
// Enable ADC1 reset calibaration register
ADC_ResetCalibration(ADC1);
// Check the end of ADC1 reset calibration register
while(ADC_GetResetCalibrationStatus(ADC1));
// Start ADC1 calibaration
ADC_StartCalibration(ADC1);
// Check the end of ADC1 calibration
while(ADC_GetCalibrationStatus(ADC1));
// 启动转换
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
skyfulstar 回答时间:2011-12-15 12:57:37

RE:STM32F103VE AD转换跨界问题

/*********************************************************************************************************
** 函数名称: ADC_Value_Handle
** 功能描述: ADC转换结果处理,10ms把4通道ADCBUFLEN   个AD值累加求平均,在把平均值,累加ADCNUMMAX 次
** 输   入: 无
** 输   出: 无
********************************************************************************************************/
void ADC_Value_Handle(void)
{
uint16 i;
uint8  j;
uint32 adc_temp;
for(j=0;j
火雷达 回答时间:2011-12-15 12:55:58

回复:STM32F103VE AD转换跨界问题

你这种情况还真是有点头痛。我看了下你的测量数据,正常情况下AD值应该有+-3个的波动,进位的时候,有10个左右AD值(这个的话,相对来说,还是正常的)
建议做法:
1、把信号源输入电压提高比如1V以上,看看是否有进位时误差太多
2、把采样速度加快,看看比如1mS采样一次,看看AD值是否异常
3、确认一下信号源是否稳定,可以尝试用2.5V基准分压输出,看看情况
还有应该问题是,输入太小,相对来说,ADC的精度有比较大的影响,STM32有一篇文章专门介绍了提高ADC精度的,2.5V精度的,在输入1.25V时,相对比较好。
火雷达 回答时间:2011-12-15 13:15:31

回复:STM32F103VE AD转换跨界问题

PA0,听别人说,是有点问题的,不知道你是否用了这个AD口
废鱼 回答时间:2011-12-15 14:36:16

RE:STM32F103VE AD转换跨界问题

for(j=0;j
这个是不是不对?我还是建议你把你查看一下采集到的数据,因为你这里做平均运算,很可能发生的问题是将前面和后面采集到的电压值进行处理的时候,有的会被正好抵消。
skyfulstar 回答时间:2011-12-16 08:20:16

回复:STM32F103VE AD转换跨界问题

回复第 13 楼 于2011-12-15 05:15:31发表:
PA0,听别人说,是有点问题的,不知道你是否用了这个AD口 

我用的是PA0-PA4,发现问题的是PA1,之后我把四个脚连在一起测量,出的数值都有错误。
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版