搜索
查看: 3157|回复: 0

[STM32F446] cubeMAX配置双通道ADC+dma(二)定时器触发

[复制链接]

该用户从未签到

53

主题

3438

帖子

61

蝴蝶豆

论坛元老

最后登录
2024-3-19
发表于 2018-11-14 22:27:17 | 显示全部楼层 |阅读模式
本帖最后由 数码小叶 于 2018-11-14 22:27 编辑

虽然在上一篇中已经实现了ADC的采集,但是在实际应用中还是有很大的缺陷,那就是采样率,太高了,实际需求是几十Hz,所以还得采用定时器来。
试了很多配置,最后成功了两组,一组是定时器中断函数里触发ADC,一组是定时器直接触发ADC,不涉及中断函数。第一组方法有很多种,只要产生中断就可以了,可以是普通定时中断,比较中断,pwm中断。。。。
参考第一篇,知道这里ADC的配置要做更改

Snipaste_2018-11-12_10-13-48.jpg


然后选择触发源
Snipaste_2018-11-12_10-15-51.jpg


Snipaste_2018-11-12_10-23-41.jpg

然后打开定时器时钟,内部时钟
Snipaste_2018-11-12_10-21-07.jpg

接下来配置定时器
Snipaste_2018-11-12_10-48-59.jpg

这里的参数完全根据自己的时间需要来更改。首先参考F446的时钟树,但是F446的时钟树描述的并不是很详细,参考下面的小字描述 Snipaste_2018-11-12_13-13-45.jpg
其实这个就是和cubeMax配置界面相对应的
Snipaste_2018-11-12_13-16-46.jpg
但是到这还是看不出TIM2挂在哪个总线上了,还得继续往下
Snipaste_2018-11-12_13-07-51.jpg
到这就可以了,挂载在APB1上(同时可以发现TIM1和TIM8挂载在更高速的APB2上)
Snipaste_2018-11-12_13-20-35.jpg
再看TIM2的分频寄存器描述
Snipaste_2018-11-12_10-38-15.jpg
所以这里分频89+1,90,即90MHz/(89+1)最后是1MHz,然后由计数周期确定最后频率,这里为20Hz。保存,生成工程,打开,添加两句启动代码:
  1. HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 2);
  2.         HAL_TIM_Base_Start_IT(&htim2 );
复制代码

如果用定时器,根据自己的中断类型选择相应的处理函数,比如我用的
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)  
  2. {  
  3.                 HAL_ADC_Start(&hadc1);
  4.           HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 2);
  5. //                printf("Time is out");
  6. }
复制代码
具体用哪个,已经在void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim)里写的很详细了
Snipaste_2018-11-12_15-36-54.jpg


最后,利用串口输出结果
Snipaste_2018-11-12_10-57-35.jpg





回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-5-14 17:08 , Processed in 1.164398 second(s), 33 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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