在昨天的博文 信号转换问题 | 模拟电路解决方式 中对于前天的 信号转换的解题思路 进行了实物仿真。尽快其中做了些改进,但是在控制二倍频的三角波的频率、幅值、占空比方面还是有很多的问题。主要表现在: 那么,通过一个单片机是否可以完成同样的功能呢。 下面是选用的STC单片机来实现相同的功能。 使用STC的ISP软件对单片机进行硬件设置,设置IRC频率为35MHz。 下载基础程序之后的单片机开始能够工作。 STC8G1K 单片机的PWM输出可以有6,7,8,.10等不同的位数。在同样的系统时钟下,不同的位数对应的输出PWM的频率以及精度各不相同。 特别注意:需要在主程序中将PWM输出端口设置为推挽输出模式。 在35MHz下,6bit的PWM频率大约为540kHz。下面是通过510欧姆和0.1uF的电容对输出的PWM波形进行滤波,可以得到比较平滑的直流分量。 如果设置为8Bit,则输出PWM的波形的频率降低4倍,大约137kHz。通过10k欧姆、0.1uF的阻容滤波,所得到的直流分量可以看到有一些比较明显的波动了。 设置比较器,比较器结果通过CMPOE输出。 特别注意的是,需要明确在主程序中,将比较器的输出通过 PM_PP设置为推挽输出。 在比较器中断中,测量半周期: 这是由于在单片机中进行波形数据区间长度为:buffer =9000 由于PWM DA输出的时间间隔为0.2ms,所以按照它它的20倍来估计三角波的最短周期为4ms,对应的频率为250Hz。 下面是对应的三角波的频率在300Hz是的波形,可以明显看出三角波的台阶。 通过前面的实验,可以验证,通过一个简单的单片机的电路,便可以完成对应的波形转换的功能。不仅简化了设计,同时也提高的波形转换的性能。 本文中所涉及到的硬软件文件可以从以下链接下载:
01设计电路1
1.实验电路设计
▲ 实验原理图
▲ 实验电路板
2.单片机固件设置
▲ STC8G1K08单片机硬件设置
▲ 下载固件之后的单片机
02单片机程序设计2
1.设置PWM输出
▲ 设置PWM输出6BIT
▲ PWM输出以及滤波后的直流信号 8BIT
2.设置比较器
#if CMP_EN void 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 }
▲ 比较器输出
//------------------------------------------------------------------------------ #if CMP_INT_EN void CMP_ISR(void) interrupt 21 { CMPCR1 &= ~0x40; // Clear the interrupt flag if(g_nSignalPeriodCount != g_nSignalPeriod) { g_nSignalPeriod = g_nSignalPeriodCount; if(g_nSignalPeriod > PWM_BUFFER) { g_nSignalPeriod = PWM_BUFFER; } g_ucSignalPeriodInitFlag = 1; } g_nSignalPeriodCount = 0; g_nSignalPWMBufferPoint = 0; } #endif // CMP_INT_EN
3. :初始化TImer0输出
//------------------------------------------------------------------------------ void InitSignalPWMBuffer(void) { unsigned int i; unsigned int nUpPeriod, nDownPeriod; unsigned long nMax; if(g_nSignalPeriod > PWM_BUFFER) g_nSignalPeriod = PWM_BUFFER; g_ucSignalPeriodInitFlag = 0; nMax = g_nSignalPeriod; nMax *= g_ucSignalPWMDuty; nMax /= 100; nUpPeriod = (unsigned int)nMax; nDownPeriod = g_nSignalPeriod - nUpPeriod; nMax = PWM_MAX; nMax = nMax * g_ucSignalPWMAmplitude; nMax /= 0xff; for(i = 0; i < nUpPeriod; i ++) { g_ucSignalPWMBuffer[i] = (unsigned char)(i * nMax / nUpPeriod); } for(i = 0; i < nDownPeriod; i ++) { g_ucSignalPWMBuffer[i + nUpPeriod] = (unsigned char)((nDownPeriod - i) * nMax / nDownPeriod); } }
▲ 测试输出波形
▲ 占空比的改变
▲ 改变幅值
03极限测试
PWM DA输出是Timer0的中断,时间间隔为 ts=200us。
那么,三角波的周期最长为: buffer * ts = 0.18s。对应的频率为5.556Hz▲ 频率过低的时候出现的波形断续
▲ 三角波在300Hz是的波形
04结论
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算