18438|9

2

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

stm32 用中断方式实现ADC的多通道、单次转换 [复制链接]

最近在学习stm32f103rbt6。发现网上都是用DMA实现ADC的多通道、连续转换。 我想用中断实现ADC的多通道、单次转换。在中断函数里读取每次转换的结果,但是,用我下面的代码,只能实现读出一个通道的转换结果。百思不得其解,请大家帮我分析分析。谢谢!

void ADC_init(void)
{
           ADC_InitTypeDef ADC_InitStructure;
           ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        
           ADC_InitStructure.ADC_ScanConvMode = ENABLE;
           ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;   // 单次转换
           ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
           ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
           ADC_InitStructure.ADC_NbrOfChannel = 2;
           ADC_Init(ADC1, &ADC_InitStructure);
           ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 2, ADC_SampleTime_239Cycles5);
           ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 1, ADC_SampleTime_239Cycles5);          

           ADC_TempSensorVrefintCmd(ENABLE);
           ADC_Cmd(ADC1, ENABLE);
           ADC_ResetCalibration(ADC1);
           while(ADC_GetResetCalibrationStatus(ADC1));
           ADC_StartCalibration(ADC1);//开始校准  
           while(ADC_GetCalibrationStatus(ADC1));//等待校准完成
           ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
}

u16 Get_ADC(void)
{
        unsigned int i;
        u16 temper=0,temp=0;
        temp=ADC_GetConversionValue(ADC1);
        temper +=temp;
        Delay(0xfff);
        return temper;
}

void ADC1_2_IRQHandler(void)
{
ADC_Temp=Get_ADC();  //ADC_Temp 和 Vsense 是全局变量
  printf("  %d",ADC_Temp);
        Vsense=(ADC_Temp*3.3)/4096;

        printf("the temperature now is : %.2f\n",Vsense);
ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);

}
此帖出自stm32/stm8论坛

最新回复

很奇怪,我用L07x的ADC中断方式转换多通道,依然只能得到第一个数据,用的是EOC和EOS中断的方式 [attach]302871[/attach]   详情 回复 发表于 2017-5-24 14:57
点赞 关注
 

回复
举报

4008

帖子

0

TA的资源

版主

沙发
 
用注入模式
        ADC_InjectedChannelConfig(ADC1, ADC_INJECTED_GROUP1_CHANNEL1, 1, ADC_CHANNEL_SAMPLETIME);
        ADC_InjectedChannelConfig(ADC1, ADC_INJECTED_GROUP1_CHANNEL2, 2, ADC_CHANNEL_SAMPLETIME);

一次四个,结果在寄存器JDR1~4中
此帖出自stm32/stm8论坛

点评

版主您好。关于STM32的AD,如果说我们用的是N个通道的规则采样,并且使能了扫描模式,那么就只能使用DMA。不然读数就存在问题了,(对比单次转换的情况,仅一个通道,那我们可以在AD转换中断EOC里面取读取AD的值)因  详情 回复 发表于 2017-2-1 20:11
 
 

回复

171

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
huo_hu 发表于 2013-7-23 17:27
用注入模式
        ADC_InjectedChannelConfig(ADC1, ADC_INJECTED_GROUP1_CHANNEL1, 1, ADC_CHANNEL_SAMPLETIME ...

版主您好。关于STM32的AD,如果说我们用的是N个通道的规则采样,并且使能了扫描模式,那么就只能使用DMA。不然读数就存在问题了,(对比单次转换的情况,仅一个通道,那我们可以在AD转换中断EOC里面取读取AD的值)因为AD的EOC中断是在一次转换完成之后才触发的,N个通道转换完。。AD寄存器里面保存的是最后一次转换的结果,这导致了在中断当中没法正常读取全部的转换值了。您觉得我这样理解对吗?或者就用您说的方法,注入组,4个通道各有一个寄存器,可以将转换的结果保存
此帖出自stm32/stm8论坛

点评

也不是,dma的触发条件和通道的转换是两个问题,自动切换通道的方式有两种,规则和注入。 dma的触发只能是一种就是ad转换完成。 不知道说清楚没有  详情 回复 发表于 2017-2-2 22:37
 
 

回复

4008

帖子

0

TA的资源

版主

4
 
本帖最后由 huo_hu 于 2017-2-2 22:41 编辑
jonny0811 发表于 2017-2-1 20:11
版主您好。关于STM32的AD,如果说我们用的是N个通道的规则采样,并且使能了扫描模式,那么就只能使用DMA ...

也不是,dma的触发条件和通道的转换是两个问题,自动切换通道的方式有两种,规则和注入。
dma的触发只能是一种就是ad转换完成,特别的你可以用扫描模式注入和规则模式里整个序列转换完才算是完成,dma的源地址是可以设置的。注入方式的数据保存地址是连续的。

不知道说清楚没有
此帖出自stm32/stm8论坛

点评

谢谢版主,我结合文档再看看,因为以前也没怎么深入接触AD  详情 回复 发表于 2017-2-4 02:51
 
 
 

回复

171

帖子

0

TA的资源

一粒金砂(中级)

5
 
huo_hu 发表于 2017-2-2 22:37
也不是,dma的触发条件和通道的转换是两个问题,自动切换通道的方式有两种,规则和注入。
dma的触发只能 ...

谢谢版主,我结合文档再看看,因为以前也没怎么深入接触AD
此帖出自stm32/stm8论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

6
 
本帖最后由 huo_hu 于 2017-2-4 11:41 编辑

比如你想固定的转换8个通道,可以用规则方式的dma,直接把每次转换后的数据dma到buf,buf【0】 【1】 【2】。。。【7】的数据依次是8个通道的结果。
此帖出自stm32/stm8论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
你用扫描模式单次转换,转换的结果只能是最后一个通道的 ,规则组只有一个寄存器ADC_DR,你每次转换的值都会被下一次的值覆盖掉,要用DMA把转换的数据传到RAM,每转换完一个通道DMA会把数据传走不影响下一次转换值,转换完最后一个通道的时候产生EOC,就可以读取多通道的数据了
此帖出自stm32/stm8论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
本帖最后由 zzmxoo 于 2017-5-23 22:55 编辑

103的手册中,AD的控制寄存器CR1中置位EOCIE,允许产生EOC中断,但是产生这个中断是在 一组转换结束时候产生,就是文档中的通道组转换结束置位,而,ADC只有一个DR, 置位的时候,就是你得到的最后一个通道的数值,之前的其他结果都被覆盖了,在SCAN位的描述中也有说明。

eocie.png (18.46 KB, 下载次数: 1)

eocie.png

eoc.png (17.31 KB, 下载次数: 1)

eoc.png

scan.jpg (66.15 KB, 下载次数: 2)

scan.jpg
此帖出自stm32/stm8论坛

点评

谢谢回复,很详细。  详情 回复 发表于 2017-5-24 09:51
 
 
 

回复

2万

帖子

71

TA的资源

管理员

9
 
zzmxoo 发表于 2017-5-23 22:48
103的手册中,AD的控制寄存器CR1中置位EOCIE,允许产生EOC中断,但是产生这个中断是在 一组转换结束时候产生 ...

谢谢回复,很详细。
此帖出自stm32/stm8论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
zzmxoo 发表于 2017-5-23 22:48
103的手册中,AD的控制寄存器CR1中置位EOCIE,允许产生EOC中断,但是产生这个中断是在 一组转换结束时候产生 ...

很奇怪,我用L07x的ADC中断方式转换多通道,依然只能得到第一个数据,用的是EOC和EOS中断的方式


此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表