如何通过单片机串口输出模拟量?
如何通过单片机串口输出模拟量?
一、前言
如果在电子线路设计中,碰到一个情况,那就是,单片机没有DAC资源,也没有多余的 PWM 端口可以使用。只剩下一个 串口还能用。那么如何通过该端口输出模拟电压呢?
利用单片机的端口,输出一个占空比可以调节的方波信号,经过RC低通滤波器,去除其中的交流分量之后,便可以输出方波信号中的直流信号。那么就剩下一个问题了,如何应用 UART 输出一个高电平占空比可以改变的方波信号呢?
单片机的串口发送一个字节的信号波形中,包括一个bit 的起始位,一个bit 的停止位。它们分别是0 和 1,这是无法改变的。中间八个bit的数据位是可以改变的。比如发送0x44,其中就会包含有两位高电平。这样就有了8个可以被控制的高低电平的数据位。那么这就可以实现 3bit 位的 DAC输出了。如果想实现 8bit 的 DAC输出。则需要 256个可以被控制的数据位。这样只要将连续32个发送字节合在一起,变可以形成256位可以控制高低电平的信号波形。从而实现 8bit 的 DAC 输出了。下面通过单片机测试一下这种串口输出模拟量的性能。
二、测试电路
设计基于STM32F103的测试电路板。这颗芯片我手边有很多,所以选择它进行实验。利用它的 串口2 进行测试。串口1用于程序的下载。使用RC低通滤波器对 TXD2信号进行滤波。实际上 RXD2 是没有使用的。另外,还将两路ADC引导端口。这样,可以利用ADC对外边送入的信号进行采集之后,再从 TXD2 送出,验证一下对音频信号的采集与合成的功能。布置单面测试电路板。其中包括一个飞线,使用 0 欧姆电阻进行跳线。
一分钟之后获得了两块测试PCB电路板,其中有一块有点过腐蚀。使用另外一块比较正常的进行测试。
接下来,焊接电路,放置在面包板上进行测试,面包板直接给测试电路提供 3.3V的工作电源,程序通过探针夹子进行下载。
三、软件测试
设置单片机的 UART2 的基本参数。输出波特率为 1MHz。这样可以提高输出信号的更新率。通过示波器可以测量到输出信号 每一位的时间 为1微秒,对应 1MHz的波特率。启动DMA输出模式,UART2 便可以通过DMA持续发送内存中 32 个字节内容。
将32个字节设置为0,输出的电压波形,经过滤波之后测得的直流电压为 0.326V。其中看到的脉冲是每个字节的停止位对应的高电平脉冲。设置32个字节都为 0xff,看到的低脉冲是每个字节的起始位。读取的滤波后的直流电压为 2.9V。设置32个字节为 0x55。此时出现正负交替的脉冲波形,滤波之后的直流电压为 1.61V。
下面分别设置32个字节中,高电平位数从0变化到255,测量滤波之后的输出直流电压。可以看到随着位数的增加,输出直流电压线性上升。由于串口发送字节存在着起始位和停止位,所以对应的直流信号不是从零开始,最高电平也不是输出信号的最高值。
设置输出DMA中的32个字节的 1 的位数按照正弦波变化,串口信号滤波之后输出完美的正弦波形。设置输出数据递增,滤波后的波形呈现锯齿波形。在下降沿出现缓变,这是因为输出RC低通滤波引起的。这是输出高低电平的情况,RC低通滤波在上升和下降沿都引起缓变。
四、总结
本文测试了利用单片机串口输出PWM波形,然后通过低通滤波形成直流电压。利用这种方式,的确可以在特殊的情况下,给单片机产生一个DAC的端口。