在昨天的博文 信号转换问题 | 模拟电路解决方式 中对于前天的 信号转换的解题思路 进行了实物仿真。尽快其中做了些改进,但是在控制二倍频的三角波的频率、幅值、占空比方面还是有很多的问题。主要表现在:

  • 控制量之间的耦合,特别是频率,占空比对输出信号幅值的影响;
  • 频率对于占空比的影响虽然经过改进之后,还是会有部分的影响;
  • 输出心慌可失真,这主要是最后一级从方波到三角波转换的过程中,对于信号的直流分量的变化与波形失真之间的关系;
  • 最后一点,也是最重要的一点,就是电路非常复杂。

那么,通过一个单片机是否可以完成同样的功能呢。

下面是选用的STC单片机来实现相同的功能。


01设计电路1

1.实验电路设计

▲ 实验原理图

▲ 实验电路板

2.单片机固件设置

使用STC的ISP软件对单片机进行硬件设置,设置IRC频率为35MHz。

▲ STC8G1K08单片机硬件设置

下载基础程序之后的单片机开始能够工作。

▲ 下载固件之后的单片机


02单片机程序设计2

1.设置PWM输出

STC8G1K 单片机的PWM输出可以有6,7,8,.10等不同的位数。在同样的系统时钟下,不同的位数对应的输出PWM的频率以及精度各不相同。

特别注意:需要在主程序中将PWM输出端口设置为推挽输出模式。

在35MHz下,6bit的PWM频率大约为540kHz。下面是通过510欧姆和0.1uF的电容对输出的PWM波形进行滤波,可以得到比较平滑的直流分量。

▲ 设置PWM输出6BIT

如果设置为8Bit,则输出PWM的波形的频率降低4倍,大约137kHz。通过10k欧姆、0.1uF的阻容滤波,所得到的直流分量可以看到有一些比较明显的波动了。

▲ PWM输出以及滤波后的直流信号 8BIT

2.设置比较器

设置比较器,比较器结果通过CMPOE输出。

特别注意的是,需要明确在主程序中,将比较器的输出通过 PM_PP设置为推挽输出。

#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_CHSCMPCR1 |= 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 flagif(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极限测试

  1. 三角波的占空比可以从0~100%,分成100个等级进行调节;
  2. 三角波的幅值从0~256,分成256个等级进行调剂
  3. 三角波的频率:5.556Hz

这是由于在单片机中进行波形数据区间长度为:buffer =9000
PWM DA输出是Timer0的中断,时间间隔为 ts=200us。
那么,三角波的周期最长为: buffer * ts = 0.18s。对应的频率为5.556Hz

▲ 频率过低的时候出现的波形断续

  1. 三角波的最大频率: 250Hz

由于PWM DA输出的时间间隔为0.2ms,所以按照它它的20倍来估计三角波的最短周期为4ms,对应的频率为250Hz。

下面是对应的三角波的频率在300Hz是的波形,可以明显看出三角波的台阶。

▲ 三角波在300Hz是的波形


04结论

通过前面的实验,可以验证,通过一个简单的单片机的电路,便可以完成对应的波形转换的功能。不仅简化了设计,同时也提高的波形转换的性能。

本文中所涉及到的硬软件文件可以从以下链接下载:

  1. 实验AD设计文件和C51程序

  1. AD工程文件:AD\Teaching\2020\SignalChange\Ver8G1K08.SchDoc ↩︎

  2. 单片机软件:C51\STC\Test\2020\Teach\Sin2Tri\Sin2TriSTC8G1K.uvproj ↩︎

基于STC8G1K17的信号转换方案相关推荐

  1. 串口 能 按位传输吗_、 迪文串口屏TTL与主控板RS232电平信号转换方案

    迪文串口屏TTL与主控板RS232电平信号转换方案 一.TTL和RS232简述 串口.COM口是指的物理接口形式(硬件),按位(bit)发送和接收字节.而TTL.RS-232是指的电平标准(电信号). ...

  2. rs232接口_、 迪文串口屏TTL与主控板RS232电平信号转换方案

    迪文串口屏TTL与主控板RS232电平信号转换方案 一.TTL和RS232简述 串口.COM口是指的物理接口形式(硬件),按位(bit)发送和接收字节.而TTL.RS-232是指的电平标准(电信号). ...

  3. 基于内码映射方案的简繁体、全半角、gbk/utf8编码轻量级转换方案,无需三方库

    基于内码映射方案的简繁体.全半角.gbk/utf8编码轻量级转换方案,无需三方库 基于内码映射方案的简繁体.全半角.gbk/utf8编码互相转换 1. Unicode和UTF8/16/32之间的关系 ...

  4. 语音跟踪:信号分解、锁相、鸡尾酒会效应、基于PR的信号分离

    NLP中关于语音的部分,其中重要的一点是语音信号从背景噪音中分离.比如在一个办公室场景中,有白天的底噪-类似于白噪音的噪音.空调的声音.键盘的啪啪声.左手边45度7米元的地方同事讨论的声音.右手边1. ...

  5. 基于滚动轴承加速度信号的故障诊断

    基于滚动轴承加速度信号的故障诊断 一.介绍:改编自一次实验报告,数据为滚动轴承的一维加速度信号,长度为20w+,原码见文末,对于报告中出现的错误欢迎指正 二.实验名称:基于加速度信号的故障诊断实验 三 ...

  6. 连续三天说一个事情 : 信号转换

    一个同学在微信公众号(TSINGHUAZHUOQING)中提了关于在 模拟课程中的问题 ,即要求设计一个系统,输入一个正弦波,可以输出一个二倍频的三角波.三角波的幅值.占空比(上升沿.下降沿的时间)可 ...

  7. 信号转换问题 | 模拟电路解决方式

    最早在5月20日,有同学在公众号里发送来一个 波形的转换与信号处理问题,是将输入的正弦波转换成两倍频.占空比可调.幅度可调的三角波形. 下图展示了所产生的三角波形始终保持与输入正弦波两倍频的关系,并且 ...

  8. 信号转换| 如何使用模拟电路完成对方波信号倍频PWM转换?

    在博文" 波形的转换与信号处理 "中,有学生提出一个问题,如何将一个正弦波转换成一个占空比可调的三角波形? 通常情况下,将正弦波转换成一个方波相对比较容易,只需要使用一个比较器即可 ...

  9. 基于 eBPF 的 prometheus 监控方案

    基于 eBPF 的 prometheus 监控方案 1. 前言 2. ebpf_exporter 环境搭建 3. Prometheus 与 Grafana 配置 4. ebpf_exporter 代码 ...

最新文章

  1. NOI2011 道路修建
  2. 读csapp有感:大端法,小端法
  3. Python_Day4_函数
  4. Python中的字典排序
  5. 云原生体系下 Serverless 弹性探索与实践
  6. 酷!GitHub开发者自研火星车,开发教程全面开源
  7. mysql8优化实战
  8. Spring 框架教程
  9. python对比柱状图_python 绘制分组对比柱状图
  10. 七月老师python_七月在线Python数据分析入门
  11. 基于MATLAB的数字信号处理(2) 时域采样和频域采样
  12. X11 - X client数量达到上限并报错Maximum number of clients reachedxlsclients
  13. 软工专硕考研_软件工程考研:专硕、学硕实力强校排名,2020考研党择校参考...
  14. 日历组件(可加上一年下一年))
  15. jupyter note 打开md文件
  16. Linux ar命令(更改静态库相关属性信息)
  17. 如何[破解]观看加密受保护的视频文件
  18. Disruptor无锁ringbuff实现
  19. 免费营销:四大营销心理效应
  20. XP下让系统自动登录

热门文章

  1. 综合布线系统走线槽架的产品选型
  2. Windows Azure Service Bus (5) 主题(Topic) 使用VS2013开发Service Bus Topic
  3. tfs连不上团队资源管理器问题
  4. 30个免费网页图标字体以及使用方法
  5. POP3、SMTP端口(SSL、TSL)
  6. 浅析epoll – epoll例子以及分析 - C++爱好者博客
  7. 敏捷结果30天之第六天:周五回顾,找到三件做的好以及三件需要改善的事情...
  8. 北京联通限制上传到电信网络服务器
  9. ASP.net 2.0 自定义控件的开发之数据分页 第二章
  10. 用python画微信捂脸_用 Python 画一个捂脸表情