记一次在STM32开发踩过得坑(ADC采集、电流大小的影响)

**写在开头,本人本科对单片机还是比较熟悉的,8/16/32的单片机都玩过(寄存器的配置,库函数的调用),最近接了个很小的项目,以为1~2天就搞完了,结果弄了好几天,因此将该问题记录下来,大家以后碰到可以参考。

**

项目中:一个功能是通过STM32103ZET6的串口(UART1)与一个数字传感器进行通信获取数据,第二个功能通过12位ADC单通道采集模拟传感器数据,最终将二者数据进行屏显,并通过键盘进行阈值大小设置,声光报警功能。

坑1:ADC采集问题

我当时写的代码在我的一个开发板(芯片:STM32VET6)上是可以正常ADC采集数据的,当时通过串口将数据发至串口助手上打印查看,发现是OK的,(这里提一下,为了防止摸黑调试,串口助手是个好东西,)结果下载到我的STM32103ZET6最小系统板上就不对,串口助手打印一直为高电平(3.29V),我开始以为是芯片不兼容的问题(管脚定义错误这种问题我排除了,换个ADC通道采集的问题试过我也排除了),于是我找了份STM32103ZET6采集程序在ZE上还是不行,但在VE开发板上却可以,这就排除芯片不兼容问题,剩下肯定是硬件上的问题没跑了。(一步步将问题排查缩小)。由于身边还有块32的板子,我就直接拿了过来用,结果发现还是采集不了(我有3块STM32板子,1个是VE的开发板,2个是ZE的最小系统板),我纳闷了,难道是2块板子都有问题,这种问题出现的概率应该不大啊,试了一下午也没找出问题,最后我试了两块ZE板子上其他功能GPIO口,都好着,我排除两块板子的问题,可是为什么我那个VE的开发板能采集,为什么这两块就是不行,是硬件问题可是硬件到底哪里有问题?我想到了VE的开发板人家为了稳定在做的时候肯定把好多电路都已经设计上去了,而我的核心板很小,为了简化肯定哪里电路没有连接之类的(我核心板只有芯片,管脚,晶振),是不是就是ADC那里漏了,于是我找手册,发现基准电压,Vref+管脚接3.3V,Vref-接地(什么VDDA我没管),然后我用万用表一测,果然我的核心板Vref+管脚没有拉高,Vref-没有拉低,当我焊上使其连接时,好了,一切的问题搞定,其实我是先焊上Vref+接到3.3V,可以正常采集了(我开始用的湿度传感器做测试,输出在3V左右),但我的传感器输出只有10mv,采集出来还是0v,最后将Vref-接地问题才得以解决。(建议大家以后买核心板做ADC采集时,一定要先看板子上Vref和3.3V之间的跳帽有没有插上,或者测量其电压是否为高电平)。

坑2:电流问题,USB线与电流不匹配

我的供电方式通过USB线给单片机,从单片机的电压管脚引出给(2个传感器,显示屏),USB线我用的带磁环的线,一切工作正常。当我交付时,我不太想给我的USB线,所以淘宝买了根0.5米不带磁环的线,可问题就来了,单片机工作不正常问题,导致屏显输出问题,采集问题,按键按下失败问题,旁边人说是不是电路哪里虚焊了,我认为肯定是电流和线不匹配导致的问题,电流输出2A,影响单片机正常工作会导致后面这一系列问题,回来把线换了,结果一切正常,终于交付了。

至此,所有问题都解决了,有快一年半没有玩单片机了,这次的问题也是让我找了好久,所以当大家遇到问题时,先不要急,冷静分析下自己的问题有可能出现在哪里,利用手上工具尝试并排除,缩小问题范围,实在解决不了, 上各大论坛都找找解决方案。

  • 44
    点赞
  • 162
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
0; } // 添加顾客 void add_customer(Window* window, int customer_id) { if ((window->rear + 1) % MAX_QUEUE_LENGTH != window->front) { window->queue[window->rear] = customer_id; window->rear要使用STM32ADC模块采集电流,一般需要通过电阻将电流转换为电压信号 = (window->rear + 1) % MAX_QUEUE_LENGTH; } } // 处理顾客 void process_customer(WindowManager*,再通过ADC模块进行采集。 具体的实现方法如下: 1. 选择合适的电阻, manager) { for (int i = 0; i < manager->queue.count; i++) { Window* window = &manager将电流通过电阻转换为电压信号。根据欧姆定律,电流I=U/R,所->queue.windows[i]; if (!window->paused && window->front != window->rear) { printf("Customer %d is以可以通过选择合适的电阻值,将电流转换为电压信号。一般情况下,选 being served at window %d\n", window->queue[window->front], window->id); window->front = (window->front取的电阻阻值应该在10欧姆到1千欧姆之间。 2. 将电阻与STM32的 + 1) % MAX_QUEUE_LENGTH; } } } // 输出窗口信息 void print_windows(WindowManager* manager) { for (int i = 0; i < manager->queue.count; i++) { Window* window = &manager->queue.windowsADC模块连接。将电阻的一端连接到待测电流的接口,另一端连接到STM32的[i]; printf("Window %d provides service for %s\n", window->id, window->type); printf("Queue lengthADC模块的输入通道。一般情况下,可以选择ADC的单端输入模式,将电阻的一: %d\n", (window->rear - window->front + MAX_QUEUE_LENGTH) % MAX_QUEUE_LENGTH); } } ``` 这端连接到ADC输入通道,另一端连接到GND。 3. 配置ADC模块。根据需要,配置里使用了一些常量和文件路径,可以根据实际情况进行修改。另外,这个实现中ADC模块的采样频率和采样精度等参数。一般情况下,可以选择12位精度和使用了循环队列来实现窗口排队的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值