OpenEdv-开源电子网

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

HAL驱动库学习-ADC 多通道 循环采样 不用dma和中断 软件触发

[复制链接]

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2016-12-1
在线时间
8 小时
发表于 2016-12-19 16:43:15 | 显示全部楼层 |阅读模式
本帖最后由 qingyulv 于 2016-12-19 16:46 编辑



平时很少有时间在论坛分享自己的经验,这次趁领导不在,嘿嘿。
   单片机是 stm32L0,2个ad通道,要用定时器控制两个通道的采样(但不是用触发的形式),每20ms更新一次采样数据。先是参考例程的 ADC_RegularConversion_Polling,单通道时确实ok,但增加两个通道后,采样值不对,当把一个引脚接地后,ad值居然还是几百的跳,经过半天的查找,终于找到端倪了。先看下边的文章:


如何使用ADC驱动库

来源:

5  使用下面函数中的一个激活ADC外设:
    HAL_ADC_Start() -- 轮询模式
    HAL_ADC_Start_IT(), -- 中断模式
    HAL_ADC_Start_DMA(). -- DMA模式

ADC属性定义

•uint32_tClockPrescaler--时钟源,同步PLL,异步HSI  ADC_CLOCK_ASYNC
ADC_CLOCK_SYNC_PCLK_DIV2,ADC_CLOCK_SYNC_PCLK_DIV4,ADC_CLOCKPRESCALER_PCLK_DIV2,ADC_CLOCKPRESCALER_PCLK_DIV4
•uint32_tResolution -- ADC分辨率(6,8,10,12ADC_RESOLUTION12b........
• uint32_tDataAlign --数据对齐方式(左,右)ADC_DATAALIGN_LEFT, ADC_DATAALIGN_RIGHT
• uint32_tScanConvMode--配置规则组序列,该参数可以关联“DiscontinuousConvMode”对主序列细分,如果设置多个通道则序列自动使能;如果只有一个通道,执行单一转换模式;如果有多个通道,执行序列转换模式;Rank(队列)定义为通道号,rank0->channel0,rank1-->channel1.....;扫描方向可以递增(0-->18)或递减(18-->0)ADC_SCAN_DIRECTION_FORWARD,ADC_SCAN_DIRECTION_BACKWARD,ADC_SCAN_ENABLE
• uint32_tEOCSelection   --EOC(EndOfConversion),用来做轮询或中断标记;每个rank转换结束,或序列转换结束;EOC_SINGLE_CONV,EOC_SEQ_CONVEOC_SINGLE_SEQ_CONV(保留供以后用)
• uint32_tLowPowerAutoWait
• uint32_tLowPowerAutoPowerOff
• uint32_tContinuousConvMode  --定义当选择的触发事件(软件触发 or 外部触发)发生后规则组执行单一转换还是连续转换 ENABLE or DISABLE
• uint32_tDiscontinuousConvMode---指定当规则组是完整序列/非连续序列(序列分布在)时是否转换序列;只有在Continuous禁用时,DisContinuous才有效;如果ContinuousConvMode使能,则该参数抛弃
• uint32_tExternalTrigConv  --触发方式 ADC_SOFTWARE_START 外部触发禁止,使用软件触发
• uint32_tExternalTrigConvEdge  --外部触发规则,ADC_EXTERNALTRIGCONVEDGE_NONEADC_EXTERNALTRIGCONVEDGE_RISINGADC_EXTERNALTRIGCONVEDGE_FALLINGADC_EXTERNALTRIGCONVEDGE_RISINGFALLING
• uint32_tDMAContinuousRequests--//DMA转换请求,指定DMA执行单次(当转换数达标时停止传送)or连续请求模式;备注:连续模式:
//DMA必须配置为循环模式,否则当DMA buffer存满时将触发溢出; ENABLEor DISABLE
• uint32_tOverrun--选择数据溢出时的行为:保存数据或覆盖数据;这个参数只作用于规则组,包含DMA
[url=]
[/url]

说明:

  
ContinuousConvMode
  
DiscontinuousConvMode
 
通道结束
序列结束
 
 
DISABLE
DISABLE
单次转换
EOC
EOS
单次转换
触发一次,转换一个序列(转换所有被选通道),转换结束后停止
ENABLE
无效
连续转换
EOC
EOS
连续转换
触发一次,转换一个序列(转换所有被选通道),转换结束后自动重新开始
DISABLE
ENABLE
断续转换
EOC
EOS
断续转换
触发一次,转换一个通道,在触发,在转换。在所选转换通道循环



问题就出在了我标红的地方,之前都是一个通道连续采样好几次 (采样4次时间为128us), 再换另一个通道用同样的方式去采样。但是表格中的配置里,都是要几个通道轮询采样的,不管是自动还是手动(表格中最后一个是每次要通过 HAL_ADC_Start  软件触发的,)所以意味着 注定每个通每个循环只能采样一次,

菜鸟级,不喜勿喷,会打击我的!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 08:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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