ADC 采样芯片级联的问题

本文禁止转载。

本次遇到的问题是:

几个ADC采样芯片进行级联使用,使用SPI接口获取数据。

在使用单个ADC芯片的时候,读写是正常的。也可以正常读取chipID

ADC芯片级联的时候,在使用STM32F4或者GD32F4 系列的Cortex M4芯片来读写,也没有问题。

后续为了降低成本,把Cortex M4系列的ARM内核降低为 Corten M0系列

结果发现读取chipID 不成功

代码逻辑一致,移植也没有问题。

最终定位的问题,就是SPI因为要读取级联ADC 芯片的数据,比单独读取一个ADC芯片所花费的时间腰长

且因为切换到Cortex M0 系列的芯片后,主频一下子从200MHZ 降低为48MHZ

读取速度变慢了,导致之前的代码中SPI来不及读取

后面在SPI时序中,增加了读取时序的延迟时间,读取就正确了。

### HC32芯片ADC采样耗时分析 对于HC32系列微控制器而言,ADC采样的具体耗时取决于多个因素,包括但不限于ADC分辨率设置、工作频率以及所使用的触发方式等。通常情况下,在默认配置下完成一次12位精度的ADC转换大约需要一定数量的CPU周期。 当使用定时器作为触发源时,每次计数结束后会触发一次AD采样操作[^1]。这意味着实际采样时间不仅涉及内部A/D转换所需的时间,还包括外部触发延迟和其他可能存在的等待状态。为了精确测量这一过程中的总消耗时间,可以通过以下方法进行估算: #### 方法一:基于硬件手册计算理论值 查阅HC32的数据手册可以找到关于不同模式下的典型转换时间和所需的时钟周期数目。例如,在某些条件下,单次12-bit ADC转换大约占用若干个系统时钟周期。如果系统的主频设定为特定MHz,则可以根据这些参数推算出大致的毫秒级或微妙级别的响应速度。 #### 方法二:通过软件编程实测 编写一段简单的测试程序来记录两次连续采样之间的时间间隔也是一种有效手段。下面给出了一段用于演示如何利用嵌入式C语言和汇编指令组合实现高精度计时的小例子: ```c #include "hc32f460.h" void DelayUs(uint32_t us){ uint32_t ticks = SystemCoreClock / 1000000 * us; while(ticks--) { __NOP(); } } int main(void){ // 初始化代码... volatile uint32_t start_time, end_time; /* 开启ADC */ M0P_ADC->CTRL_f.PD = 0; // 取消掉电模式 M0P_ADC->CFG_f.ADCEN = 1; // 启动ADC /* 准备开始第一次采样前获取当前滴答计数值 */ start_time = SysTick->VAL; /* 执行一次ADC采样并等待其结束 (假设已经正确设置了中断服务例程ISR)*/ /* 当进入对应的ADC中断处理函数后立即保存新的滴答计数值 */ end_time = SysTick->VAL; /* 计算差值即为本次采样的近似耗时(us),注意这里简化了溢出处理逻辑*/ uint32_t elapsed_us = ((SystemCoreClock / 1000000)*(start_time - end_time)) >> 24; return 0; } ``` 上述代码片段展示了怎样借助`SysTick`定时器配合循环内的空操作(`__NOP()`)来进行短时间段的延时控制,并尝试捕捉ADC采集前后的时间戳差异以评估整个流程的实际开销。需要注意的是,这种方法得到的结果可能会受到多种因素的影响而有所偏差,因此建议多次实验取平均值得到更接近真实情况的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sgmcy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值