本帖最后由 jobszheng 于 2024-1-28 15:34 编辑
【STM32MP135F-DK测评】电动汽车交流充电PWM波通讯实现
我国新能源汽车的保有量不断再创新高。这一数字更是让我们减少化石燃料所带来的碳排放。不需要加油,那肯定就要充电了。充电桩,充电枪很好理解——肯定要与电网,与车相连接嘛!那么小功率慢充(家用)交流充电桩要如何实现车到桩的通讯,并完成充电控制的呢?
我们先简单看一下国标的GB/T 20234系列协议标准描述,如下图所示:
从上图的示意图我们可以清晰地看到CP引线连接到充电桩的PWM波发生器,其为电力传输的控制信号线。连接线有了,那它具体是如何控制的呢?我们接着往下看:
对于家庭普通随车充,即使用市电,墙插座为取电来源时,一般PWM波的占空比为15%。通过对上表数据的分析,可以计算得出来充电电流约为9A,即充电功能约为1980W。如果使用空调等16A插座,则需要调整PWM占空比为25%,以增加充电功率。
理论学习我们已经完成,动手实践的环节来了。
首先,我们看一下默认镜像系统中是否包含了PWM波驱动。
结果有点意外,镜像里面没有PWM驱动的操作文件。这样只能自己编译驱动加载到内核中了。Let‘s Go!
我们需要先修改一下dts,打开文件stm32mp135f-dk.dts(arch/arm/boot/dts/)将其status变更为okay。如下图所示代码: &timers3 {
/delete-property/dmas;
/delete-property/dma-names;
status = "okay";
pwm1:pwm {
pinctrl-0 = <&pwm3_pins_a>;
pinctrl-1 = <&pwm3_sleep_pins_a>;
pinctrl-names = "default", "sleep";
status = "okay";
};
};
然后,我们通过make menuconfig来查看一下驱动是否正确识别。
make arch=ARM stm32mp135f-dk.dtb LOADADDR=0xC2000040
如上图所示,则代码驱动正常识别。因为我们仅仅修改了DTS,没有更新kernel里面的内容,所以我们在本次实验中仅编译dts即可。在shell中输入make命令 scp arch/arm/boot/dts/stm32mp135f-dk.dtb root@192.168.72.1:/boot
reboot
稍等片刻,待机器重启后,我们再次访问 /sys/class/pwm文件夹后,就可以看到有pwmchip0的文件夹了。
下面我们就配置一下PWM外设,让其产生我们所需要的占空比吧! echo 3 > export
echo 200000 > pwm3/period
echo 20000 > pwm3/duty_cycle
echo 1 > pwm3/enable
echo 30000 > pwm3/duty_cycle
echo 50000 > pwm3/duty_cycle
我们通过示波器来观察一下STM32MP135输出的波形吧!
再来一张我的实验现场图:
总结
对于(家用)慢充交流桩的控制信号的测试我们就完成到这里了。通过本次测试,也可以明显感受到STM32MP135在充电桩的典型应用上面还是非常轻松即可胜任。将其剩余的算力用于携带多个子桩也更大发挥了其性能优势。
本次原型设计验证了STM32MP135在充电桩上的应用可行性,图形界面实现的可能性与网络负载能力。
待完善的地方也存在,比如GTK图形化编程的深入理解;对数据存储方面的测试;当然,还有其security boot功能。限于时间,又恰逢年底,在试用时间内未能完成。
附1
交流充电桩协议我已经在我的比亚迪便捷充电器上改装完成了!由2000w的充电功率提升到了3000w,减少了近9小时的充电时间。不过,额定10A的充电枪连接线略有发热。
附2
在编译dts文件前,需要安装ST官方的sdk(en.sources-stm32mp1-openstlinux-6.1-yocto-mickledore-mp1-v23.06.21.tar.gz)。安装完成后,仍然要解压linux源代码: tar xvf linux-6.1.28.tar.xz
之后还需要安装patch cd linux-6.1.28
for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
再部署一下fragments make ARCH=arm multi_v7_defconfig "fragment*.config"
for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done
yes '' | make ARCH=arm oldconfig
特别提醒:在输入上述命令的时候,如果新开terminal的话,不要忘记source一下编译环境哟!
|