打印

请教STM32的AD在多通道使用时候和单通道使用的时候的偏差问

[复制链接]
5305|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bmwlover02|  楼主 | 2009-7-27 11:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
手里有一个产品,使用到STM32的AD的两个通道,一个为Regular方式,阵发性打开,采样率为250HZ,另一个为Inject通道,每一秒钟检测一次,用以检测设备的电池电量。现在的现象是在没有开启regular方式的时候检测电池电量正常,一旦开启的regular方式,inject通道似乎测试的值也收到了影响,inject通道值偏大,而用万用表测试这两种情况下电源电压恒定。按照现在的设计只要我打开了regular测量,界面上电池不管电量多低基本都显示电池电量满,请问大家有遇到这个问题么
初始化的程序如下
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
  ADC_Init(ADC1, &ADC_InitStructure);
 ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_55Cycles5);
  ADC_DiscModeChannelCountConfig(ADC1, 1);
  ADC_DiscModeCmd(ADC1, ENABLE);
//ADC_10为电源电压测试
ADC_InjectedSequencerLengthConfig(ADC1, 1);
ADC_InjectedChannelConfig(ADC1, ADC_Channel_10,1,ADC_SampleTime_28Cycles5);
ADC_InjectedDiscModeCmd(ADC1, ENABLE);
ADC_ExternalTrigInjectedConvConfig(ADC1,ADC_ExternalTrigInjecConv_None);
ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
  /* Check the end of ADC1 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC1));
 ADC_StartCalibration(ADC1);
  while(ADC_GetCalibrationStatus(ADC1));



regular调用的代码是在定时器中断中加入
if ((TIM3->SR & 0x0001) != 0) {                 // check interrupt source
       ADC_SoftwareStartConvCmd(ADC1, ENABLE);
       ADCFinish=0;
       while(!ADCFinish)
           {
ADCFinish=ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC);
           }          
analog[ADCCount]=ADC_GetConversionValue(ADC1);


Inject是在另一个进程中一秒钟一次调用如下代码
ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);
 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_JEOC));
ADC_Inject_PowerV=ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1);
ADC_SoftwareStartInjectedConvCmd(ADC1, DISABLE);

问题是一旦打开定时器中断后ADC_Inject_PowerV明显增大
沙发
香水城| | 2009-7-27 11:56 | 只看该作者

这2个通道各使用的是哪个引脚?

使用特权

评论回复
板凳
bmwlover02|  楼主 | 2009-7-27 12:10 | 只看该作者

回复

regular使用的是PC4,Inject检测电池电量用的PC0,有关系么

使用特权

评论回复
地板
香水城| | 2009-7-27 12:33 | 只看该作者

又看了一下你的帖子,怎么还有进程?你使用了操作系统?

如果使用了操作系统,请保证对ADC模块的互斥访问,最好不要在不同的进程中同时调用ADC模块的函数。

使用特权

评论回复
5
bmwlover02|  楼主 | 2009-7-27 13:57 | 只看该作者

关于ADC模块

我现在确实需要一个ADC是以250HZ的频率采样,另外一个是以1HZ的频率采样,如果是因为互斥引起的问题,那么也应该是偶尔出现的吧,不会每一次都出现过大吧,我现在inject在比如在同一个电压下不开定时器中断采出来的值是1600,一开定时器或者说一开另一个通道采固定电压的这个通道就变成了1800左右,但是这个值依然会随着电压高低而变化,只是多了一个200左右的偏移

使用特权

评论回复
6
bmwlover02|  楼主 | 2009-7-27 14:09 | 只看该作者

做了一个实验

应该是两个AD,也就是regular和inject相互干扰的问题,因为如果每次进定时器中断都不使能regular另一个AD通道,也就是注释掉       ADC_SoftwareStartConvCmd(ADC1, ENABLE);
       ADCFinish=0;
       while(!ADCFinish)
           {
ADCFinish=ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC);
           }    
另一个通道的值就不会变大

使用特权

评论回复
7
bmwlover02|  楼主 | 2009-7-27 14:11 | 只看该作者

现在的问题

现在的问题是我需要在250HZ的regular下采样inject,而regular的采样用的是定时器中断,inject不管是不是进程中还是在中断中都有可能被干扰,有什么具体的办法解决这个问题么

使用特权

评论回复
8
香水城| | 2009-7-27 16:47 | 只看该作者

1Hz与250Hz的周期是倍数

如果周期是倍数的,则一次又问题,因为同步,每次都会有问题。

使用特权

评论回复
9
bmwlover02|  楼主 | 2009-7-27 16:59 | 只看该作者

加入了互斥变量,问题依然

程序更改为,中断中的regular如下
if ((TIM3->SR & 0x0001) != 0) {      // check interrupt source

while(Regular_inject_Not_SameTime!=0);//等待互斥变量等于0
Regular_inject_Not_SameTime=1;
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
       ADCFinish=0;
       while(!ADCFinish)
           {
ADCFinish=ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC);
           }
Regular_inject_Not_SameTime=0;

inject 也加上
while(Regular_inject_Not_SameTime!=0);//等待互斥变量等于0
Regular_inject_Not_SameTime=1;
ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);
 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_JEOC));
ADC_Inject_PowerV=ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1);
ADC_SoftwareStartInjectedConvCmd(ADC1, DISABLE);
Regular_inject_Not_SameTime=0;

问题依然,一旦打开定时器中断,得到的ADC_Inject_PowerV就比不打开定时器中断大很多,而且似乎还跟着regular的值变化

使用特权

评论回复
10
香水城| | 2009-7-27 17:07 | 只看该作者

你最好单独做一个小的测试项目,仅仅测试这个问题

这样可以排除因为操作系统协调所产生的问题。

使用特权

评论回复
11
bmwlover02|  楼主 | 2009-7-27 17:21 | 只看该作者

问一下

按照我程序上看,操作方式是对的吧,没有什么明显错误吧?如果没有什么明显错误我就新建一个简单工程来测试这个问题

使用特权

评论回复
12
bmwlover02|  楼主 | 2009-7-27 18:08 | 只看该作者

曲线救国。。。。

问题还是没有找到,不过把inject的ADC1更改为ADC2,问题就彻底没有了。。就是估计多了几个mA...哎...7号电池又得少用一会儿了。。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

25

帖子

1

粉丝