#技术资源# #有奖活动# #申请原创#
一、引言
本次的第二届RISC-V MCU创新应用大赛。是本人第一次参加的线上报名集中时间进行创作的单片机项目设计比赛。和以往的教育部开展的比赛不同。这类比赛由厂商赞助举办。在此次比赛中提供的条件对于第一次参赛的我来说已经足够。借由官方提供开发板的机会,制作基于CH32V307评估板的单相正弦波逆变电源设计。本次设计的软件代码。硬件系统电路图。结构框图等均完全开源。大家如果对本作品感兴趣也可自行下载后研究。
二、系统结构
1.系统结构框图介绍
系统主要分为三个部分。分别是供电控制电路。信号产生电路。主电路。
主电路由独立的直流稳压电源一路输入。驱动电路正常工作时。可将输入的直流电压通过H桥两组桥臂交替导通不断切换直流电在输出侧的方向。形成交流电。包含了基波和高次谐波分量。通过LC滤波电路设计滤除高次谐波后得到接近50Hz正弦波输出。
供电控制电路由另一独立直流稳压电源输入。接入电路后调整至12V。使IR2103正常工作。同时为设计不同电平供电。将12V电压通过LM7805稳压至5V提供给反相器芯片74LS00以及6N137光耦供电。
信号产生电路由PC-USB接口开始给单片机供电。同时可下载程序。USB接口接入单片机后。由单片机的PWM模块产生同相位的一组SPWM。一路SPWM经由反相器反向后输入6N137光耦隔离电路。输出再接入IR2103控制一组桥臂。另一路同理。但没经过反相直接输入光耦接IR2103后驱动另一组桥臂。
2.电路原理图介绍
这里提示原理图未提及的另一部分。单片机的PA8和PB13引脚接入的是一个排针组的P3.6位置和P3.5位置。单片机电源和地分别接VCC-5VMCU以及SGND_protect。
单片机SPWM输出引脚分别为
原理图部分如上图所示。这里重点讲述驱动电路设计。
6N137光耦的其他使用方法可以参考这篇博客
https://blog.csdn.net/liuzq/article/details/73658076
这里主要讲述同相输入输出下的电路设计
|
| 6N137内部电路图
| 6N137真值表
| 芯片内部主要由输入侧的发光二极管。以及输出侧反接的光敏二极管。以及后级与门接三极管基极组成。首先这个芯片由于左侧接入的是一个发光二极管。一般情况默认都是阳极也就是2脚接输入信号。为防止电流过大需要串接限流电阻。需要参考datasheet自行计算。这里不再过多赘述。因此观察真值表可以发现。只有在使能端接入低电平时才能实现输入和输出之间的同相关系。可以按照使能端接低电平。或者参照上述电路原理图的设计。以3脚作为输入接口。并通过2脚接电阻至电源。这样原本的高电平点亮发光二极管就变成低电平点亮。真值表输入侧情况变化。其余都不变。即实现了使能接高电平时6N137输入与输出同相。
接下来说一下芯片内部工作。假设2脚接电阻连VCC。3脚位单片机信号输入端。
当输入高电平。发光二极管不亮。因此光敏二极管截止。则与门的两个输入口一个接使能H。另一个接低电平。输出低电平。三极管不导通。因此输出悬空。此时一般是在输出端加上拉电阻。这样6N137输出高电平。
当输入低电平。发光二极管亮。光敏二极管导通。与门的两个输入接口接入两个高电平。输出高电平使得三极管导通。集电极连接射级接地。使得6N137输出被拉低。最终输出低电平。
关于IR2103驱动部分介绍
|
| IR2103引脚图
| 驱动电平情况图
| 由上两图可以看出。当我们将IR2103的HIN和LIN短接后。一路信号输入IR2103即可得到HO和LO这一组互补电平信号。用于驱动H桥上下邻管一组MOS。(斜对管一组MOS接相同的信号实现同时导通或截止)。而信号都需要有参考端存在。HO以Vs为参考端。LO则以芯片的GND为参考端。因此芯片需要与主电路共地。此芯片调试时应当出现当供电为12V。信号输入就绪后。在LO端可以测得输出信号。而因HO的参考Vs一般在主电路中。若主电路未接入电源则此部分是否正常工作难以知晓。这一点也是此方案的缺陷
3.pcb设计说明
这里PCB设计起初我采用的是相对不安全的方案。也就是单片机的GND和主电路的GND直接连接。这样做的优点是因为整个系统都以一个GND作为参考。电位统一。调试时一般保证电路不存在短路。则可快速得到相应的验证结论。而此方法的缺点就是如果调试未确定因素较多。亦或者欠缺相关调试经验。则不恰当的供电会导致主电路灌电。由GND到单片机最终烧毁单片机。当单片机不贵时可以采用此方法。对于功能较多且比较珍贵的单片机我还是推荐下面的调试方法。将单片机的GND与主电路GND隔离。
此种隔离则是考虑到变压器存在原边副边。可以通过输出与输入通过磁的联系将输入传递到输出。而将两侧完全分离。在pcb中并不是完全按照此理论设计。而只是简单的将单片机的地通过排针引出。与主电路的地相互分离。这样单片机GPIO由光耦保护。GND被主动隔离。但缺点是由于参考电位不统一。在输出调试时只能得到一个大致的结果。但可以通过此方法确保系统在隔离下可产生结果。则表明系统无其他错误。此时可通过短接单片机的地与主电路地再次进行测量即可。(对应在上图的PCB中,H11和H7均为信号地SGND。单片机的地在左下角排母处插入)
实际还有第三种最稳妥的方案。也就是通过专门的电源隔离模块。实现电源电平转换的同时将电源完全隔离。同时地参考电位可传递。这里由于初期设计时未考虑。后续设计可考虑加入。
三、软件说明
在说明软件设计前。我先为大家讲述一下SPWM波发生的方式以及原理
从上面这张图可以看出来。SPWM单极性调制与双极性调制本质区别在于两组桥臂是半个周期内交替导通还是一组不断的通断控制,另一组完全截止。而第一种的难点在于按照周期控制PWM输出。需要在程序中按照我们想要得到的正弦波频率。找到中点时间。依据这个时间对MOS管进行分组导通。设置难度比较大。故我们采用第二种双极性调制方式。
双极性调制在实际使用时就较为简单可行了。因为只需要满足半个周期内两组管子可以交替导通。并且PWM占空比按照正弦规律变化即可。这两点在软件上还是比较方便实现的。
此程序软件的设计步骤包括如下几点
明确硬件需要的功能。对所使用的的单片机片上资源做大致了解。根据得到的信息。去查找官方例程里符合我们要求的例子。集中阅读这些代码。将里面所用到的所有内容结合官方手册资料搞清楚。之后就可以根据我们项目的需要来设计这一部分的具体功能。
首先我参考的例子是官方的PWM_Output。这一个例子里面就讲述了如何配置输出PWM。
例程采用TIM_CH1通道可在两种PWM模式下切换产生PWM。
例子中的定时器计数模式采用向上计数。
开始设计时我参照例子也使用了向上计数模式。而更新时则通过检测向上计数溢出标志位进行更新
而这样的结构表示一个定时器只产生一路PWM。则需要两个定时器实现。而两个定时器分先后启动。这样最终得到的波形体现出来就是波形不能完全互补。有一定的时间误差由启动造成的。更换为一个定时器配置波形互补输出即可解决这一问题。最终选择了定时器1的CH1,通过查阅手册可以找到对应的引脚
通过查阅手册找到对应的引脚为PA8和PB13两个引脚。一个是TIM1_CH1。另一个是TIM1_CH1N
接下来说明中央计数模式与SPWM发波的关系以及相对于向上计数模式的优点。
因为通过中央对齐模式。从0到ARR再到0才是一个完整的PWM周期。这样就比向上计数多记录了一轮。最终导致配置PWM时按照向上计数模式配置的周期 =中央对齐模式周期* 2.也即向上计数配置了PWM频率20K。在中央对齐模式下实则只有10K。
CH32V307的中央对齐模式有三种。
项目代码里采用了第三种。中央对齐模式3.也就是向上和向下计数时比较中断标志置位。这样向上和向下计数时都会更新CCR寄存器。只不过也都需要在核心计数器溢出时的更新事件产生。最终才会使本次配置的CCR起作用。也就是本次配置的CCR会在下一轮计数时起作用。这样就实现了PWM占空比按照正弦规律不断变化。
输出比较中断置位是在向上或向下计数时。而进入比较中断是在核心技术器经过CCR值后触发进入中断
使能预装载功能的作用:
我在代码里只尝试了中央对齐模式3。其他情况大家也可自行尝试
接下来阐述SPWM数组的产生方法
这三个公式。其中第一个是根据SPWM双极性调制原理得出。Uc为正弦波幅值。U为载波幅值。实际上Uc/U为设定的调制比。也就是说。我们在程序一旦定下了ARR的值。就可以生成几百个点。取值按照正弦函数一周期变化规律。将一系列值乘调制比后再乘ARR周期。然后取反后再加上ARR周期。就得到了占空比按正弦规律变化的CCR值。这一过程可以利用excel实现。提取数组后复制到记事本中。利用程序对记事本的数据加逗号整理。将最终的内容复制到ide中。这一方法比较繁琐。也可以利用MATLAB直接计算后就可以得到类似的数组。
软件代码中其它设置的细节。我已经在开源的代码文件中写清了详细注释。大家可以下载阅读
四、方案测试结果
这里我给出搭建好系统的外观图。以及相应的测试结果图像
外观图
附:调试时为预防单片机烧毁。测试时另外购买了CH32V307VCT6主控核心板代替CH32V307VCT6评估板。代码在两个板子上均可运行。
调试结果图:
上电情况图:
代码已经托管至gitee云端。访问链接https://gitee.com/xy_zzz/spwm-generation
硬件pcb文件访问链接:https://pan.baidu.com/s/1ZPqF4srIeWXky-xslg_ftg?pwd=1234
|