打印
[活动专区]

【AT-START-F425测评】+【01】外部触发ADC采样

[复制链接]
968|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AD, ar, dc
本帖最后由 mxkw0514 于 2022-3-18 15:36 编辑

#申请原创# #申请开发板#
收到雅特力AT-START-F425板卡了,该板卡整体PCB布局比较大气,对比了其它系列的开发板亦是如此,虽然说紧凑有紧凑的好处,宽松有宽松的好处,但是我还是比较喜欢宽松大气一点的开发板,找起引脚起来比较容易,不至于把眼睛看瞎。先来看看收到的板卡吧。AT-START-F425板卡的正反面如下所示,板卡上面集成了一个调试仿真器——AT-Link-EZ,虽然它不是带隔离功能的,但是不用额外再买一个,省去了额外接线的好处,如果测评写得好的话,还可以额外收到一个带隔离功能的调试仿真器,岂不快哉。




根据官方手册上显示,片内ADC有18个通道,采样频率能够达到2MSPS,这个性能已经可以适用大部分场合,当然拿他来做示波器的波形采样也不是不可以,只是性能不高而已,根据奈奎斯特定律,这样的示波器最多也就测量1MHz频率的波形吧,毕竟ATF425是超值型单片机吧。ATF425单片机的片内ADC结构框图如下所示,在学习过程中遇到了一点小插曲,实际上ATF425只有16个外部通道, adc_ordinary_channel_set(ADC1, ADC_CHANNEL_17, 1, ADC_SAMPLETIME_239_5)这个函数中使用了ADC17,我一直找ADC17对应的GPIO,并没有发现该复用ADC外部输入的GPIO口,百思不得其解后,终于在RM_AT32F425_CH手册中发现ADC17是内部参考电压,你说搞笑不搞笑。



本次主要使用外部触发ADC采样GPIO口的电压值,使用的例程为exint_trigger_partitioned,该例程实现思路大致是初始化设置、ADC采样程序和外部中断程序编写,初始化设置包括时钟初始化、板卡元器件初始化(LED灯、按键等)、外设初始化(USART、Extern、DMA、ADC、GPIO),ADC采样程序的核心函数为adc1_ordinary_valuetab,外部中断程序功能是GPIO口低电平触发三次后,ADC才开始完成采样,其程序如下所示:
void ADC1_IRQHandler(void)
{
  if(adc_flag_get(ADC1, ADC_PCCE_FLAG) != RESET)
  {
    adc_flag_clear(ADC1, ADC_PCCE_FLAG);
    if(preempt_trigger_count < 3)
    {
      adc1_preempt_valuetab[preempt_trigger_count][0] = adc_preempt_conversion_data_get(ADC1, ADC_PREEMPT_CHANNEL_1);
      adc1_preempt_valuetab[preempt_trigger_count][1] = adc_preempt_conversion_data_get(ADC1, ADC_PREEMPT_CHANNEL_2);
      adc1_preempt_valuetab[preempt_trigger_count][2] = adc_preempt_conversion_data_get(ADC1, ADC_PREEMPT_CHANNEL_3);
      preempt_trigger_count++;
    }
  }
}

本次例程中的触发有有抢占通道转换和普通通道转换,在抢占通道和普通通道的GPIO口都同时检测到低电平触发后,首先执行抢占通道触发的中断程序,待该中断程序执行完后才开始执行普通通道触发的中断的程序。将AT-START-F425板卡的USART1接头通过TTL转串口连接电脑,下载口通过USB连接电脑下载程序后,例程测试结果如下所示,采样值为0x00都是普通通道的ADC采样值,而0xFFF都是抢占通道的ADC采样值。不过在该例程中,必须要注释掉while(dma_trans_complete_flag == 1),否则程序不往下执行,这是什么原因呢?



可能这是刚出的芯片型号,学习资料不是很多,对于广大学生而言,什么厂家的学习资料多,自然而然就会选择那家厂家的单片机进行学习,久而久之,等毕业以后,也就离不开学生阶段使用熟练的单片机了,这或许是一个普遍现象,ST的芯片在中国推广的这么好应该也有一部分这样的原因吧,STM32的学习资料应该是众多单片机系列中最全的了。


使用特权

评论回复
沙发
hoop| | 2022-3-4 19:36 | 只看该作者
外部中断程序功能是GPIO口低电平触发三次后,ADC才开始完成采样。实际上如下描述才是准确的
——普通通道组是通过PA11口的上升沿触发转换,由于配置了普通通道的分割模式,因此每个PA11的上升沿只会触发1个普通通道的转换,以此规则序列进行。
——抢占通道组是通过PA15口的上升沿触发转换,每次PA15的上升沿会触发整个抢占组的一次序列转换。待一个序列转换完毕后,置位PCCE,该PCCE的置位会响应你图示的代码中断。

使用特权

评论回复
板凳
hoop| | 2022-3-4 19:43 | 只看该作者
不过在该例程中,必须要注释掉while(dma_trans_complete_flag == 1),否则程序不往下执行,这是什么原因呢?
——这是因为PA11口上的上升沿次数给得不够,导致普通通道的转换未执行完成。
——代码设计中,dma_trans_complete_flag是在DMA传输完成中断内置位的。DMA的buffer_size设计为9,即搬运9笔数据后才会置位dma_trans_complete_flag这个标志。ADC的普通通道配置为分割模式(其中单次触发通道转换数是1),因此在PA11上需要累计给9个上升沿,才会完成普通通道的转换并响应DMA完成中断。

使用特权

评论回复
评论
mxkw0514 2022-3-7 09:52 回复TA
谢谢你 
地板
mxkw0514|  楼主 | 2022-3-5 01:12 | 只看该作者
hoop 发表于 2022-3-4 19:43
不过在该例程中,必须要注释掉while(dma_trans_complete_flag == 1),否则程序不往下执行,这是什么原因呢 ...

谢谢你

使用特权

评论回复
5
两只袜子| | 2022-3-7 10:02 | 只看该作者
大家真积极啊,这么快就发测评贴了

使用特权

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

本版积分规则

32

主题

562

帖子

5

粉丝