可再生能源是满足我们电力需求的实用且负担得起的解决方案。通过增加可再生能源,我们可以减少空气污染,减少全球变暖排放,创造新的就业机会和产业,使我们的电力供应多样化,减少对煤炭和其他化石燃料的依赖,并使世界走向更清洁、更健康的能源未来。我们打算创建一个照明控制系统,使我们能够节省能源。照明控制系统广泛应用于商业、工业和住宅空间的室内和室外照明。照明控制系统用于在需要的时间和地点提供适量的光。
作为主要目标,我想到了三件事:
应用:我们家中、公司甚至公共道路上的“夜灯控制”或“路灯控制”。也可用于给3V、5V、12V电池充电。
STM32F407G-DISC1配置
正如我们在示意图中看到的,这个系统主要执行两个功能:首先它专门为电池充电,一旦充满电,然后通过 LDR 光传感器打开或关闭灯,如果它是晚上打开灯,如果是白天,则将其关闭。为了更好地描述这个项目,我把它分为以下几个部分:
1.- 软件安装
2.- 电源
3.- 充电控制
4.- 负载控制
5.- 夜灯控制
6.- 从正弦函数生成控制 PWM 信号
7.- 从 PID 控制器生成控制 PWM 信号
8.- 电路板设计
9.- 组装
10.- 测试
11.结论
(Timing: 6 hrs)
我使用的是32位的Windows 10操作系统,软件安装如下:
a)我已经安装了“GNAT Programming Studio”,我们可以从以下链接下载它:https ://www.adacore.com/download/more
在此链接中,我下载并安装了以下两个程序:
b)我们要安装STM32F407VG板的USB驱动,链接如下:https://www.st.com/en/development-tools/stsw-link009.html#getsoftware-scroll。我们在此站点上下载以下文件:“en.stsw-link009.zip”。连接设备后,我们会在“设备管理器”中验证它是否已连接。
c)为了开发这个项目,我们使用“Ada Drivers Library”,我们可以从以下链接下载它:https ://github.com/AdaCore/Ada_Drivers_Library
为了设计我的项目,我使用了以下示例:“demo_timer_pwm”、“demo_adc_polling”和“demo_gpio_direct_leds”。您可以在此处找到的文件夹: https ://github.com/AdaCore/Ada_Drivers_Library/tree/master/arch/ARM/STM32/driver_demos
d) CircuitMaker是针对业余爱好者、黑客和创客社区的印刷电路板设计电子设计自动化软件。您可以在以下位置下载安装软件:https ://circuitmaker.com/
e) Lowell Cady 的 PID示例是 PID(比例、积分、微分)控制的工作示例,您可以在此处下载:https ://www.codeproject.com/Articles/36459/PID-process-control-a -巡航控制示例
(Timing: 2 hrs)
它是如何工作的?
a)开关电源提供 12 伏特直流、5 安培的稳定电压和 330 瓦的最大功率。使用此设备,我们会发现系统具有良好的稳定性,我们必须调整我们想要为电池充电的电压负载并使用电位器 (R10)。我们可以在这里查阅国际标准:https ://standards.ieee.org/standard/765-2012.html
b)集成电路 LM317 用于通过电位器 R10 产生 3 至 12 伏的电压调节。这个集成的技术规格说它不能产生低于 3 伏的电压。在这个例子中,我调整了 5.6 伏。计算是:
在 LM317 的技术表中,我们找到以下公式:
Vout =Vref [1+(R2/R1)] +(iADJ)(R2)
例如,LM317 可以工作的最大电压是 37 伏,如果在我们的图表中我们将 R9 取为 240 欧姆,那么我们对 R10 进行计算。
Vout =Vref [1+(R10/R9)] +(iADJ)(R10)
我们考虑一个非常小的 iADJ 值,如果我们计算 R10,我们将有:
R10 = (R9/Vref) (Vout -Vref)
R10 = (R9/1, 2) (Vout - 1, 2)
R10 =(240/1, 2)(37-1, 2) = 7, 160 欧姆
对于实际用途,我们使用 10k 电位器。
c)齐纳二极管 DZ 用作电压调节器,在它的输出端我获得了 10.8 伏的最大值,这是我用电压表测量的。
d)使用的保护装置如下:保险丝 F1、电容器 C1 和二极管 D1。这些元件对于保护系统免受短路、放电、消除反向直流电流和过滤不需要的信号非常重要。
(Timing: 3
hrs)
它是如何工作的?
a)在该电路中以 Vcc 为单位测量的电压,电压表指示为 5、45 伏。在这个例子中,我使用了一个由四个 1、5 伏可充电电池组成的模块。最大负载电压为 5.6 伏。我用的是镍氢电池,我们可以在这里找到国际标准:https ://www.mpoweruk.com/standards.htm
b) STM32F407VG 板生成的 PWM 信号将用于调节充电电池的负载。为了生成此 PWM 信号,我们采用“Ada 驱动程序库”中的示例“demo_timer_pwm”并对其进行修改以获得所需的 PWM 信号。例如,如果电池完全放电,则 PWM 信号具有较大的占空比。
c)晶体管 T1 用于物理分离 STM32F407VG 板和 M1 Mosfet。如果它们直接连接,那么这个设备就会损坏,因为 Mosfet 工作在非常高的负载下。电阻 R1 (1k) 必须取一个较低的值,以提高 PWM 信号的开关速度。
d)但是,在晶体管 T1 的输出端,我们有一个 180 度的异相信号,为了调整这种情况,我们使用晶体管 T2,现在 PWM 信号是同相的。
e)为了将截止区和饱和区驱动到我们的 T1 和 T2 晶体管,我们做出以下考虑:
为了确定饱和电流,我们认为输出栅极的发射极集电极电压等于零。因此:
VCC=IC*RC+VCE | VCC=IC*RC+0
我C=VCC/RC
为了确定截止点,我们认为基极电流等于零,因此集电极电流等于零:
VCC=IC*RC+VCE | VCC=0*RC+VCE
VCE=VCC
f)使用的保护装置如下:电容器 C1 和二极管 D2。二极管用于消除电池充满电时的反向直流电流。如果这个二极管不存在,那么电池就会在晶体管 T1 和 T2 中感应出电压。
(Timing: 3 hrs)
它是如何工作的?
a) 10K 的电阻 R4 和 8K 的 R5 用作分压器,用于使用我们的 STM32F407VG 板测量可充电电池的电量。8K 电阻是通过两个串联电阻实现的:4k7 + 3k3。VR5的值我们通过分压器的计算得到它,这就是:VR5=(R5/(R4+R5))*VBattery)
b)当STM32F407VG板的PD12引脚up时,三极管T3驱动,异相180度。晶体管 T4 校正晶体管 T3 并使原始信号与 PD12 引脚同相。
c)为了将截止区和饱和区驱动到我们的 T3 和 T4 晶体管,我们做出以下考虑:
为了确定饱和电流,我们认为输出栅极的发射极集电极电压等于零。因此:IC=VCC/RC
为确定截止点,我们认为基极电流为零,因此集电极电流为零:VCE=VCC
d)当脉冲到达 IPT60R028G7 Mosfet 的“Gate”引脚时,“Source”和“Drain”之间的电路闭合,5 瓦灯点亮。当漏极和源极之间的电压 (VDS) 超过称为饱和电压 (Vds sat) 的固定值时,该 MOSFET 晶体管进入饱和区。也就是说; 在以下情况下,MOSFET 将位于该区域:
VGS > Vt和VDS > (VGS – Vt)。
在 IPT60R028GT 的技术表中我们看到:
栅极阈值电压
V(GS)th 最小值 = 3
V(GS)th 典型 = 3.5
V(GS)th 最大值 = 4 V
因此,我们需要 3 到 4 伏的“栅极”电压才能将 Mosfet IPT60R028GT 置于饱和区。
e)使用的保护装置如下:电容器 C2 和保险丝 F2。
(Timing: 3 hrs)
它是如何工作的?
a)这个“夜灯控制”为我们服务,知道是白天还是晚上并激活灯。该电路由 STM32F407VG 板的 5 伏供电。
b)为了控制照明,我们使用光敏电阻或 LDR 传感器。光敏电阻由高电阻半导体制成。在黑暗中,光敏电阻的阻值可高达数兆欧 (MΩ),而在光照下,它的阻值可低至数百欧姆。https://en.wikipedia.org/wiki/光敏电阻
c)当完全黑暗时,LDR 传感器具有最大电阻(兆欧),T5 晶体管被极化并且在它的输出端我们有最小电压,在逆变器电路 (IC40106) 的输出端我们有 5 伏。IC40106是触发器施密特反相器电路。在下图中我们可以了解到一个非反相电路是如何工作的,这有助于我们理解反相电路40106是如何工作的。当您想用非数字信号控制数字电路时,这些电路很有用。
40106 的 VT 和 VT- 值(所有值均以伏特为单位)
d)我们通过电路中所示的肖特基二极管将这个 5 伏特转换为 3 伏特,并将该电压施加到我们的 STM32F407VG 板的 PA0 引脚。
e)当光照最大时,则相反。LDR 传感器具有最小电阻,T5 晶体管没有极化,在它的输出端我们有 5 伏的 Vcc,它通过 IC40106 逆变器电路的引脚 9 进入。最后我们有 0 伏,它被施加到 STM32F407VG 板的 PA0 引脚。
f)为了将截止区和饱和区驱动到我们的 T5 晶体管,我们做出以下考虑:
为了确定饱和电流,我们认为输出栅极的发射极集电极电压等于零。因此:IC=VCC/RC
为确定截止点,我们认为基极电流为零,因此集电极电流为零:VCE=VCC
g)在 STM32F407VG 板的 PA0 引脚上,当电压为零时,红色 LED 亮起,灯熄灭。当我们有 5 伏特时,绿色 LED 亮起,电灯亮起。
(Timing: 1
day)
在这个板上,我们将生成 PWM 控制信号,激活负载,并监控电池电压和“夜灯控制”的状态。我们还将使用它的 4 个 LED 作为我系统状态的指示器。您可以在代码部分找到该程序。项目库:“带夜灯控制的电池充电器”
它是如何工作的?
a)我们监控 PA1 模拟端口上的电池电压,其中我们的值从 0 到 4095 ADC。
b) PWM信号是在STM32F407VG板上通过Timer4的中断和30kHz正弦函数的产生而产生的。在我们的代码中,我们使用以下说明指示它:
Arg := Long_Float((Raw*5)/4095); -- 5 is an experimental value
Value := Percentage (50.0 * (1.0 +Sine (Arg))); -- duty cycle value
Power_Control.Set_Duty_Cycle (Value);-- PWM signal
我们将根据正弦函数逐渐调整占空比。
正弦函数使用以下代码计算:
function Sine (Input : Long_Float) return Long_Float;
-- In this demonstration we roll our own approximation to the sine function
-- so that it doesn't matter which runtime library is used.
function Sine (Input : Long_Float) return Long_Float is
Pi : constant Long_Float := 3.14159_26535_89793_23846;
X : constant Long_Float := Long_Float'Remainder (Input, Pi * 2.0);
B : constant Long_Float := 4.0 / Pi;
C : constant Long_Float := (-4.0) / (Pi * Pi);
Y : constant Long_Float := B * X + C * X * abs (X);
P : constant Long_Float := 0.225;
begin
return P * (Y * abs (Y) - Y) + Y;
end Sine;
https://visualgdb.com/tutorials/arm/stm32/fpu/
此代码生成我的项目所需的以下三个占空比,如下所示:
占空比是信号或系统处于活动状态的一个周期的一部分。占空比通常表示为百分比或比率。周期是信号完成一个开关周期所花费的时间。作为一个公式,占空比 (%) 可以表示为:D= (PW/T)x100%
其中 D 是占空比,PW 是脉冲宽度,T 是信号的总周期。https://en.wikipedia.org/wiki/Duty_cycle
c) VR5的值我们通过分压器的计算得到,即:VR5=(R5/(R4+R5))*VBattery)
d)如果电池电压低于大约 4 伏,则红色 LED 亮起,绿色和橙色 LED 熄灭。在本例中,我们的值小于 2457 ADC。
e)如果电池电压超过约 5.4 伏,则橙色 LED 亮起,红色 LED 熄灭。在此示例中,我们的值大于 3276 ADC。
f)如果 STM32F407VG 从 PA0 端口接收到脉冲,则绿色 LED 点亮表示现在是晚上,灯通过 PD12 引脚点亮。
g)如果电池电压大约在 4 到 5.4 伏之间,橙色和红色 LED 会亮起。在这个例子中,我们有从 2475 到 3275 ADC 的值。
if Raw < 2457 then -- if the battery < 4 volts aprox
Red_LED.Set; -- Red LED os ON
Green_LED.Clear; -- Green LED is OFF
Orange_LED.Clear; -- Orange LED is OFF
delay until Clock + Milliseconds (2000); -- slow it down to ease reading
elsif Raw >= 3276 then -- If the battery > 5,4 volts aprox
Red_LED.Clear; -- Red LED is OFF
Orange_LED.Set; -- Orange LED is OFF
elsif STM32.User_Button.Has_Been_Pressed then -- If PA0 is ON
Green_LED.Set; -- Green LED is ON
else -- If battery is between: 4 to 5,4 volts aprox
Orange_LED.Set; -- Orange LED is ON
Red_LED.Set; -- Red LED is ON
end if;
(Timing: 2
days)
在此测试中,我们将使用不同的程序。您可以在代码部分找到该程序。项目库:“带夜灯控制的 PID 电池充电器”
它是如何工作的?
a)如果我们想控制一个系统,最好的解决办法是利用PID控制。PID 是一种控制回路反馈机制,广泛用于工业控制系统和各种其他需要连续调制控制的应用。PID 控制器连续计算误差值作为所需设定点 (SP) 和测量过程变量 (PV) 之间的差异,并根据比例、积分和微分项(分别表示为 P、I 和 D)应用校正,由此得名。
在我的例子中,STM32F507 板生成一个 30 kHz 的 PWM 信号,控制数据为:dt = 0.0005,Kp = 0.025 和 Ki =0.025。您可能会注意到微分项非常小或为零。我的 PID 控制器的仿真如下:
https://en.wikipedia.org/wiki/PID_controller
b)决定何时应用 PWM 控制信号的工作留给了 STM32F407 板。在我的示例中,该板执行计算并生成 PWM 控制信号。使用我的 PICkit2 设备,我得到了以下 PWM 信号。
c)分压器 VR5 向我们的端口 PA1 提供模拟值,并将其与“设定值”进行比较。“设定点”由代码编程,我们进行了一个设定点测试:VBattery = 4.95 伏/VR5 = 2、2 伏/ADC = 3003 ADC。
declare
Value : Percentage;
Raw1 : Long_Float;
setpoint : constant := 3003.0; -- VR5 = 2.2 volts / Vbat = 4.95 volts
error : Long_Float := 0.0;
output : Long_Float;
integral : Long_Float := 0.0;
dt : constant := 0.0005;
Kp : constant := 0.025;
Ki : constant := 0.025;
d)例如,如果电池放电,则程序会计算误差,并生成一个具有高占空比的 PWM 信号。如果电池已充电,则程序会生成一个占空比较小的 PWM 信号。
begin
STM32.User_Button.Initialize; -- btn instruction
loop
Start_Conversion (Converter); --adc instruction
Poll_For_Status (Converter, Regular_Channel_Conversion_Complete, Successful); --adc instruction
Raw := UInt32 (Conversion_Value (Converter)); -- reading PA1
Raw1 := Long_Float(Raw * 1);
error := (setpoint - Raw1);
integral := (integral + (error*dt));
output := ((Kp*error) + (Ki*integral));
Value := Percentage (output); -- duty cycle value
if Value < 10 then -- if the duty cycle < 10%
Power_Control.Set_Duty_Cycle (10);
Red_LED.Set; -- Red LED os ON
Green_LED.Clear; -- Green LED is OFF
Orange_LED.Clear; -- Orange LED is OFF
delay until Clock + Milliseconds (500); -- slow it down to ease reading
elsif Value >= 90 then -- If the duty cycle > 90%
Power_Control.Set_Duty_Cycle (90);
Red_LED.Clear; -- Red LED is OFF
Orange_LED.Set; -- Orange LED is OFF
elsif STM32.User_Button.Has_Been_Pressed then -- If PA0 is ON
Green_LED.Set; -- Green LED is ON
else -- If the duty cycle is from: 10 - 90 %
Power_Control.Set_Duty_Cycle (Value); -- PWM signal
Orange_LED.Set; -- Orange LED is ON
Red_LED.Set; -- Red LED is ON
end if;
delay until Clock + Milliseconds (10); -- slow it down to ease reading
end loop;
现在我们有了一个智能系统,它具有生成多个工作周期的优势,我们将更有效地利用能源。
(Timing: 2
days)
原理图电路是在CircuitMaker上制作的。您可以在自定义部件和外壳部分找到存储库。项目库:“带夜灯控制的 PID 电池充电器的电路板设计”
(Timing: 2 days)
接下来,我将向您展示一些装配图。
(Timing: 1 day)
从正弦函数生成控制 PWM 信号:
这个例子不需要设置点,PWM 信号是自动生成的,正如我们在第 6 步中看到的那样,其中只生成了三个占空比。
从 PID 控制器生成控制 PWM 信号:
设定点:VBattery = 4.95 伏/VR5 = 2、2 伏/ADC = 3003 ADC。
我们可以理解,这里的 PID 控制器会生成许多占空比。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !