打印
[方案相关]

ADC 踩坑日记

[复制链接]
45|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yellow555|  楼主 | 2025-5-23 13:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天继续鼓捣 HC32A4A0 的 ADC,原本只想采个电压,结果被坑得一塌糊涂……来,记一记,给后来人避避雷。

1.ADC没开时钟,折腾半小时
一开始初始化 ADC 死活没反应,结果是忘了开时钟:

c
复制
编辑
PWC_Fcg0PeriphClockCmd(PWC_FCG0_ADC, Enable);
不加这句,后面配置通通白搭……我调了半天寄存器,全是无效操作,血压上来了。


2.通道不使能,结果***是0
加了时钟后,数据还是全是 0,甚至是 0xFFF。后来才发现:

c
复制
编辑
ADC_ChCmd(M4_ADC1, ADC_CH0, Enable);
原来通道还要单独 enable,这不说真的不注意……


3.采样时间太短,电压值跳来跳去
测个高阻电压源,值总是不稳定,跳得离谱。最后把采样时间从默认改成:

c
复制
编辑
stcChCfg.u8SamplingTime = 0x30;
世界终于安静了……记住,时间太短,ADC还没准备好你就叫它干活,结果只能乱搞。

4.中断不进,差点以为芯片坏了
进不了 ADC 中断,以为 NVIC 配置错了。实际上只是没清前一次的标志位:

c
复制
编辑
ADC_ClearIrqFlag(M4_ADC1, ADC_FLAG_EOSEQ);
小华 ADC 的中断标志是手动清除的,不像别的一触发就自动重置,记牢!

触发源用错,定时器白配置了
我用 TIM1 想做定时触发,但 ADC 一动不动。后来才注意:

c
复制
编辑
ADC_SetTriggerSrc(M4_ADC1, ADC_TRIG_SRC_TIM1_TRGO);
触发源要和定时器一一对应,否则你触发了半天 ADC压根不理你……


记住通道顺序和 DMA 缓冲区顺序必须一致;

配置的采样数量必须等于通道数量;

启动前 DMA 要 clear flags。

一环错,全盘错。


ADC 不难,但它很“细”。时钟、通道、对齐、采样时间、触发源,每一步都能藏坑。

使用特权

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

本版积分规则

40

主题

469

帖子

3

粉丝