在昨天的博文 「信号转换问题 | 模拟电路解决方式」[1] 中对于前天的 「信号转换的解题思路」 进行了实物仿真。尽快其中做了些改进,但是在控制二倍频的三角波的频率、幅值、占空比方面还是有很多的问题。主要表现在:
- 控制量之间的耦合,特别是频率,占空比对输出信号幅值的影响;
- 频率对于占空比的影响虽然经过改进之后,还是会有部分的影响;
- 输出心慌可失真,这主要是最后一级从方波到三角波转换的过程中,对于信号的直流分量的变化与波形失真之间的关系;
- 最后一点,也是最重要的一点,就是电路非常复杂。
那么,通过一个单片机是否可以完成同样的功能呢。
下面是选用的STC单片机来实现相同的功能。
01设计电路[2]
1.实验电路设计
![c8803b3a268d6623a861c40740101622.png](https://i-blog.csdnimg.cn/blog_migrate/3667ffafda6944d6009a84fedf30ae8e.jpeg)
▲ 实验原理图
![adcd4aa6bac314ee2afa192817e33fd5.png](https://i-blog.csdnimg.cn/blog_migrate/a953106f7343a8e7b8dcd1a38b8fe66c.jpeg)
▲ 实验电路板
2.单片机固件设置
使用STC的ISP软件对单片机进行硬件设置,设置IRC频率为35MHz。
![c29b199eeb646a7794437db6bbf56c0c.png](https://i-blog.csdnimg.cn/blog_migrate/f6890d68ba120bd3575ac67263ef496f.jpeg)
▲ STC8G1K08单片机硬件设置
下载基础程序之后的单片机开始能够工作。
![4563e36c1884b4653254fa6d4da5352a.gif](https://i-blog.csdnimg.cn/blog_migrate/33c7f89f40c3d44a8d48fcdddb19a370.gif)
▲ 下载固件之后的单片机
02单片机程序设计[3]
1.设置PWM输出
STC8G1K 单片机的PWM输出可以有6,7,8,.10等不同的位数。在同样的系统时钟下,不同的位数对应的输出PWM的频率以及精度各不相同。
特别注意:需要在主程序中将PWM输出端口设置为推挽输出模式。
在35MHz下,6bit的PWM频率大约为540kHz。下面是通过510欧姆和0.1uF的电容对输出的PWM波形进行滤波,可以得到比较平滑的直流分量。
![38d7b61925c4429e7493ca2097360f9d.gif](https://i-blog.csdnimg.cn/blog_migrate/e02a47f6ff982f0d4ae9a1242283695c.gif)
▲ 设置PWM输出6BIT
如果设置为8Bit,则输出PWM的波形的频率降低4倍,大约137kHz。通过10k欧姆、0.1uF的阻容滤波,所得到的直流分量可以看到有一些比较明显的波动了。
![48b4b523c85245c3bb6764acb74a2e46.gif](https://i-blog.csdnimg.cn/blog_migrate/35457b127504818158698b2f2604b067.gif)
▲ PWM输出以及滤波后的直流信号 8BIT
2.设置比较器
设置比较器,比较器结果通过CMPOE输出。
特别注意的是,需要明确在主程序中,将比较器的输出通过 PM_PP设置为推挽输出。
#if CMP_ENvoid SetCMPPort(unsigned char ucPort) { if(ucPort * CMP_P3) { ACC = P_SW2; ACC &= ~CMPO_S; P_SW2 = ACC; } else if(ucPort * CMP_P4) { ACC = P_SW2; ACC &= ~CMPO_S; ACC |= CMPO_S; P_SW2 = ACC; }}void CMPInit(void) { CMPCR1 = 0x84; // CMPEN CMPIF PIE NIE PIS NIS CMPOE CMPRFESS // CMPEN:0: Disable Comparator; 1:Enable // CMPIF : Interrupt flag of comparator // PIE : 1 Enable Up edge interrupt // NIE : 1 Enable Down edge interrupt // PIS : 0 : +=P3.7; 1:=ADC_CHS CMPCR1 |= 0x2; // NIS : 0 : -=BandGap; 1 : P3.6 // COMPOE : 1 : Result =P3.4,P4.1 // Compare result. CMPCR1 |= 0x30; // Enable Up and Down Interrupt. CMPCR2 = 0x0; // INVCOMPO: 0 : Positive; 1 : Inverse output // DISFLT: 0 : Enable 0.1us analog filter // LCDTY: Digital Filter}
![63e8f191cf5789bf4e076c99f94b9541.png](https://i-blog.csdnimg.cn/blog_migrate/0af0491200774c4b9038c2e2d38423cb.jpeg)
▲ 比较器输出
在比较器中断中,测量半周期:
3. :初始化TImer0输出
▲ 测试输出波形
![933afa21aadbb9ca2eb14be400103cd5.gif](https://i-blog.csdnimg.cn/blog_migrate/adf9b11611ead5e2d0ae0db616e26df6.gif)
▲ 占空比的改变
![8714e81818f1728be06328765550ec51.gif](https://i-blog.csdnimg.cn/blog_migrate/017427bddcde8d77be99cac18a8a3918.gif)
▲ 改变幅值
03极限测试
- 三角波的占空比可以从0~100%,分成100个等级进行调节;
- 三角波的幅值从0~256,分成256个等级进行调剂
- 三角波的频率:5.556Hz
❝
这是由于在单片机中进行波形数据区间长度为:buffer =9000 PWM DA输出是Timer0的中断,时间间隔为 ts=200us。 那么,三角波的周期最长为: buffer * ts = 0.18s。对应的频率为5.556Hz
❞
![4b4b57e8be7dca77a02d389100275d11.png](https://i-blog.csdnimg.cn/blog_migrate/63700a50f468d207e7af8a9edce68db1.jpeg)
▲ 频率过低的时候出现的波形断续
- 三角波的最大频率: 250Hz
❝
由于PWM DA输出的时间间隔为0.2ms,所以按照它它的20倍来估计三角波的最短周期为4ms,对应的频率为250Hz。
❞
下面是对应的三角波的频率在300Hz是的波形,可以明显看出三角波的台阶。
![62c7f5f280cf176eaa5e7014179f649e.png](https://i-blog.csdnimg.cn/blog_migrate/c33c23f81fbdfae2323d11255ad904ef.jpeg)
▲ 三角波在300Hz是的波形
04结论
通过前面的实验,可以验证,通过一个简单的单片机的电路,便可以完成对应的波形转换的功能。不仅简化了设计,同时也提高的波形转换的性能。
本文中所涉及到的硬软件文件可以从以下链接下载:
- 「实验AD设计文件和C51程序」[4]
Reference
[1] 「信号转换问题 | 模拟电路解决方式」: https://zhuoqing.blog.csdn.net/article/details/106304909
[2] 说明: 「AD工程文件」:ADTeaching2020SignalChangeVer8G1K08.SchDoc
[3] 说明: 「单片机软件」:C51STCTest2020TeachSin2TriSin2TriSTC8G1K.uvproj
[4] 「实验AD设计文件和C51程序」: https://download.csdn.net/download/zhuoqingjoking97298/12453886