使用Arduino制作一个简单的纯正弦波逆变器

在无法从电网获得交流电源的情况下,通常需要逆变器电路。逆变器电路用于将直流电转换为交流电,可分为纯正弦波逆变器和改进方波逆变器两种类型。这些纯正弦波逆变器非常昂贵,而改进的方波逆变器价格低廉。在此处了解有关 不同类型逆变器的更多信息 。在这篇文章中,我将使用arduino制作一个简单的纯正弦波逆变器,并解释电路的工作原理。
什么是 spwm(正弦脉冲宽度调制)?
顾名思义,spwm代表s正弦脉冲宽度调制。_ 您可能已经知道,pwm 信号是一种信号,我们可以在其中改变脉冲的频率以及开启时间和关闭时间,也称为占空比。如果您想了解有关 pwm的更多信息,可以在此处阅读。因此,通过改变占空比,我们改变了脉冲的平均电压。下图显示——
如果我们考虑一个在 0-5v 之间切换且占空比为 100%的pwm 信号,我们将获得 5v 的平均输出电压,同样如果我们考虑占空比为 50% 的相同信号,我们将得到2.5v 的输出电压,对于 25% 的占空比,它是那个的一半。总结了pwm信号的基本原理,接下来我们就可以了解spwm信号的基本原理了。
正弦电压主要是一种模拟电压,它会随着时间的推移改变其幅度,我们可以通过不断改变 pwm 波的占空比来重现正弦波的这种行为,下图显示了这一点。
如果您查看下面的示意图,它将看到在变压器的输出端连接了一个电容器。该电容器负责从载波频率中平滑交流信号。
利用的输入信号将根据输入信号 和负载对电容器进行充电和放电。由于我们使用了一个非常高频的spwm信号,它会有一个非常小的占空比,大概是1%,这个1%的占空比会给电容充电一点,下一个占空比是5%,这会再次充电电容器再多一点,接下来的脉冲将有 10% 的占空比,电容器将再充电一点,我们将施加信号,直到我们达到100% 的占空比,然后从那里返回到 1%。这将在输出端创建一个非常平滑的曲线,如正弦波。 因此,通过在输入端提供适当的占空比值,我们将在输出端获得非常正弦的波形。
spwm 逆变器的工作原理
上图显示了 spwm 逆变器的主要驱动部分,如您所见,我们使用了两个半桥配置的n 沟道 mosfet来驱动该电路的变压器,以减少不必要的开关噪声并保护 mosfet ,我们使用了与 mosfet 并联的 1n5819 二极管。为了减少栅极部分产生的任何有害尖峰,我们使用了与 1n4148 二极管并联的 4.7 欧姆电阻。最后,bd139 和 bd 140 晶体管配置为推挽式配置 驱动 mosfet 的栅极,因为该 mosfet 具有非常高的栅极电容,并且基极需要至少 10v 才能正常开启。在此处了解有关推挽式放大器工作原理的更多信息。
为了更好地理解电路的工作原理,我们将其缩小到 mosfet 的这一部分为 on 的程度。当mosfet导通电流时,先流过变压器,然后被mosfet接地,这样在电流流动的方向上也会感应出磁通量,变压器的铁芯会通过磁通量在次级绕组中,我们将在输出端获得正弦信号的正半周期。
在下一个循环中,电路的底部在电路的顶部,这就是我移除顶部的原因,现在电流以相反的方向流动并在该方向产生磁通量,从而反转磁芯中磁通量的方向。在此处了解有关mosfet工作原理的更多信息。
现在,我们都知道变压器是靠磁通量变化来工作的。因此,打开和关闭 mosfet,一个倒置到另一个并在一秒钟内执行 50 次,将在变压器铁芯内产生良好的振荡磁通量,而变化的磁通量将在次级线圈中感应出电压,如我们知道法拉第定律。这就是基本逆变器的工作原理。
该项目中使用的完整spwm 逆变器电路如下所示。
构建 spwm 逆变器所需的组件
spwm逆变器电路结构
对于这个演示,电路是在 veroboard 上构建的,借助原理图,在变压器的输出端,会有大量的电流流过连接,因此连接跳线需要尽可能厚。
spwm逆变器的arduino程序
在我们开始理解代码之前,让我们先弄清楚基础知识。通过以上工作原理,您已经了解了pwm 信号在输出端的样子,现在的问题是我们如何在 arduino 的输出引脚上产生如此变化的波形。
为了产生变化的 pwm 信号,我们将使用16 位定时器 1 ,预分频器设置为 1,如果我们考虑正弦波的单个半周期,这将为每个计数提供 1600/16000000 = 0.1ms 时间,在波的半个周期内恰好适合 100 次。简单来说,我们将能够对正弦波进行 200 次采样。
接下来,我们必须将我们的正弦波分成 200 段,并根据幅度的相关性计算它们的值。接下来,我们必须将这些值与计数器限制相乘,将其转换为定时器计数器值。最后,我们必须将这些值放入查找表中以将其提供给计数器,我们将获得正弦波。
为了让事情更简单一点,我使用了一个来自github的非常好的 spwm 代码,它是由kurt hutten编写的。
代码很简单,我们通过添加所需的头文件开始我们的程序
#include #include  
接下来,我们有两个查找表,我们将从中获取计时器计数器值。
int lookup1[] = {50 ,100 ,151 ,201 ,250 ,300 ,349 ,398 ,446 ,494 ,542 ,589 ,635 ,681 ,726 ,771 ,814 ,857 ,899 ,940 ,981 ,1020 , 1058 ,1095 ,1131 ,1166 ,1200 ,1233 ,1264 ,1294 ,1323 ,1351 ,1377 ,1402 ,1426 ,1448 ,1468 ,1488 ,1505 ,1522 ,1536 ,1550 ,1561 ,1572 ,1580 ,1587 ,1593 , 1597 ,1599 ,1600 ,1599 ,1597 ,1593 ,1587 ,1580 ,1572 ,1561 ,1550 ,1536 ,1522 ,1505 ,1488 ,1468 ,1448 ,1426 ,1402 ,1377 ,1351 ,1323 ,1294 ,1264 ,1233 , 1200 ,1166 ,1131 ,1095 ,1058 ,1020 ,981 ,940 ,899 ,857 ,814 ,771 ,726 ,681 ,635 ,589 ,542 ,494 ,446 ,398 ,349 ,300 ,5,250 ,201 , 100 ,50 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0};int lookup2[] = {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,50 ,100 ,151 ,201 ,250 ,300 ,349 ,398 ,446 ,494 ,542 ,589 ,635 ,681 ,726 ,771 ,814 ,857 ,899 ,940 ,981 ,1020 , 1058 ,1095 ,1131 ,1166 ,1200 ,1233 ,1264 ,1294 ,1323 ,1351 ,1377 ,1402 ,1426 ,1448 ,1468 ,1488 ,1505 ,1522 ,1536 ,1550 ,1561 ,1572 ,1580 ,1587 ,1593 , 1597 ,1599 ,1600 ,1599 ,1597 ,1593 ,1587 ,1580 ,1572 ,1561 ,1550 ,1536 ,1522 ,1505 ,1488 ,1468 ,1448 ,1426 ,1402 ,1377 ,1351 ,1323 ,1294 ,1264 ,1233 , 1200 ,1166 ,1131 ,1095 ,1058 ,1020 ,981 ,940 ,899 ,857 ,814 ,771 ,726 ,681 ,635 ,589 ,542 ,494 ,446 ,398 ,349 ,300 ,5,250 ,201 ,100 ,50 ,0};  
接下来,在设置部分,我们初始化定时器计数器控制寄存器以清除每个寄存器。如需更多信息,您需要查看 atmega328 ic 的数据表。
tccr1a = 0b10100010; /*10 匹配时清除,为 compa 设置为 bottom。 10 在比赛中清除,在底部设置为 compb。 00 10 wgm1 1:0 用于波形 15。 */ tccr1b = 0b00011001; /*000 11 wgm1 3:2 用于波形 15。 001 计数器上没有预分频器。 */ timsk1 = 0b00000001; /*0000000 1 tov1 标志中断使能。 */  
之后,我们使用预定义的值 16000 初始化输入捕获寄存器,因为这将帮助我们准确生成 200 个样本。
icr1 = 1600;// 16mhz 晶体的周期,对于每 50hz 正弦波周期 200 次细分的 100khz 开关频率。  
接下来,我们通过调用函数来启用全局中断,
sei();  
最后,我们将 arduino 引脚 9 和 10 设置为输出
ddrb = 0b00000110;// 将 pb1 和 pb2 设置为输出。  
这标志着 setup 函数的结束。
代码的循环部分保持空白,因为它是一个定时器计数器中断驱动程序。
无效循环(){;/*没做什么 。. . . 永远!*/}  
接下来,我们定义了 timer1 溢出向量,一旦 timer1 溢出并产生中断,这个中断函数就会被调用。
isr(timer1_ovf_vect){  
接下来,我们将一些局部变量声明为静态变量,并开始将这些值提供给捕获和比较电阻器。
静态整数;静态字符触发;// 每个周期改变占空比。ocr1a = 查找1[编号];ocr1b = 查找2[编号];  
最后,我们预先增加计数器以将下一个值提供给捕获和比较电阻器,这标志着这段代码的结束。
if(++num >= 200){ // 预先增加 num 然后检查它是否低于 200。 数 = 0; // 重置号码 触发=触发^0b00000001; 数字写入(13,触发); }  
测试 tl494 pwm 逆变器电路
为了测试电路,使用以下设置。
12v铅酸电池。
具有 6-0-6 抽头和 12-0-12 抽头的变压器
100w白炽灯泡作为负载
meco 108b+trms 万用表
meco 450b+trms 万用表
来自 arduino 的输出信号:
一旦我上传了代码。我测量了arduino两个引脚的输出 spwm 信号,如下图所示,
如果我们稍微放大一点,我们可以看到 pwm 波不断变化的占空比。
接下来,下图显示了变压器的输出信号。
理想状态下的 spwm 逆变器电路:
从上图中可以看出,该电路在理想运行时消耗约 13w
无负载输出电压:
逆变器电路的输出电压如上图所示,这是在没有任何负载的情况下输出的电压。
输入功耗:
上图显示了连接 40w 负载时 ic 消耗的输入功率。
输出功耗:
上图显示了该电路消耗的输出功率,(负载为 40w 白炽灯泡)
/*
* spwmv2.c
*
* 创建时间:2014 年 12 月 31 日下午 3:44:43
* 作者:库尔特·赫顿
arduino uno 的 atmega328 上的 spwm,可能与其他 atmel 芯片/arduino 板兼容。
比较输出 a 和 b 输出到 portb 引脚 1 和 2,它们分别是 uno 上的引脚 9 和 10。
了解 uno 上的 led 也很有用,它是 portb 上的引脚 5。
*/
#include
#include
// 查找每个有 200 个条目的表,标准化为最大值 1600,这是加载到寄存器 icr1 的 pwm 周期。
int lookup1[] = {50 ,100 ,151 ,201 ,250 ,300 ,349 ,398 ,446 ,494 ,542 ,589 ,635 ,681 ,726 ,771 ,814 ,857 ,899 ,940 ,981 ,1020 , 1058 ,1095 ,1131 ,1166 ,1200 ,1233 ,1264 ,1294 ,1323 ,1351 ,1377 ,1402 ,1426 ,1448 ,1468 ,1488 ,1505 ,1522 ,1536 ,1550 ,1561 ,1572 ,1580 ,1587 ,1593 , 1597 ,1599 ,1600 ,1599 ,1597 ,1593 ,1587 ,1580 ,1572 ,1561 ,1550 ,1536 ,1522 ,1505 ,1488 ,1468 ,1448 ,1426 ,1402 ,1377 ,1351 ,1323 ,1294 ,1264 ,1233 , 1200 ,1166 ,1131 ,1095 ,1058 ,1020 ,981 ,940 ,899 ,857 ,814 ,771 ,726 ,681 ,635 ,589 ,542 ,494 ,446 ,398 ,349 ,300 ,5,250 ,201 , 100 ,50 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0};
int lookup2[] = {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,50 ,100 ,151 ,201 ,250 ,300 ,349 ,398 ,446 ,494 ,542 ,589 ,635 ,681 ,726 ,771 ,814 ,857 ,899 ,940 ,981 ,1020 , 1058 ,1095 ,1131 ,1166 ,1200 ,1233 ,1264 ,1294 ,1323 ,1351 ,1377 ,1402 ,1426 ,1448 ,1468 ,1488 ,1505 ,1522 ,1536 ,1550 ,1561 ,1572 ,1580 ,1587 ,1593 , 1597 ,1599 ,1600 ,1599 ,1597 ,1593 ,1587 ,1580 ,1572 ,1561 ,1550 ,1536 ,1522 ,1505 ,1488 ,1468 ,1448 ,1426 ,1402 ,1377 ,1351 ,1323 ,1294 ,1264 ,1233 , 1200 ,1166 ,1131 ,1095 ,1058 ,1020 ,981 ,940 ,899 ,857 ,814 ,771 ,726 ,681 ,635 ,589 ,542 ,494 ,446 ,398 ,349 ,300 ,5,250 ,201 ,100 ,50 ,0};
无效设置(){
// 寄存器初始化,更多细节参见数据表。
tccr1a = 0b10100010;
/*10 匹配时清除,为 compa 设置为 bottom。
10 在比赛中清除,在底部设置为 compb。
00
10 wgm1 1:0 用于波形 15。
*/
tccr1b = 0b00011001;
/*000
11 wgm1 3:2 用于波形 15。
001 计数器上没有预分频器。
*/
timsk1 = 0b00000001;
/*0000000
1 tov1 标志中断使能。
*/
icr1 = 1600;// 16mhz 晶体的周期,对于每 50hz 正弦波周期 200 次细分的 100khz 开关频率。
sei(); // 启用全局中断。
ddrb = 0b00000110;// 将 pb1 和 pb2 设置为输出。
pinmode(13,输出);
}
无效循环(){;/*没做什么 。. . . 永远!*/}
isr(timer1_ovf_vect){
静态整数;
静态字符触发;
// 每个周期改变占空比。
ocr1a = 查找1[编号];
ocr1b = 查找2[编号];
if(++num >= 200){ // 预先增加 num 然后检查它是否低于 200。
数 = 0; // 重置号码
触发=触发^0b00000001;
数字写入(13,触发);
}
}

十四五期间大同电网将走向何处?
10分钟搞定如何在QT环境模拟LVGL V8
C语言中逻辑运算符的使用方法及优先级关系
首款全球通用AC-DC恒流LED驱动器ZD832
三星和LG电子深耕自动驾驶车辆图像传感器市场
使用Arduino制作一个简单的纯正弦波逆变器
机器视觉项目案例
松下ALPHA阿尔法洗衣机打破原有外观设计理念 打造高端品质生活
JK触发器原理是什么?
高通骁龙888更多基准跑分曝光:和A14 Bionic仍有差距
造车新势力动作频繁:前途另辟蹊径,云度年销售35000辆
待机电源非隔离恒压驱动电源icSM7015替换PN8024R
搭建百富链城区块链推广分红系统
Wacom创始人大会:会议主要内容是关于VR和MR的开发
锐捷风电场远程维护解决方案的特点及功能实现
长春中国第一汽车集团历史回顾
蓝牙究竟比WiFi厉害在哪里,看完本文你就知道了
时序分析的设计约束SDC怎么写呢?
瑞为以人脸识别为出发点 未来将带来更多智能化行业应用
AR行业重要切入口解读及四大AR明星公司