打印
[STM32MP1]

【STM32MP135F-DK测评】电动汽车交流充电PWM波通讯实现

[复制链接]
125|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jobszheng 于 2024-1-28 15:34 编辑

【STM32MP135F-DK测评】电动汽车交流充电PWM波通讯实现

我国新能源汽车的保有量不断再创新高。这一数字更是让我们减少化石燃料所带来的碳排放。不需要加油,那肯定就要充电了。充电桩,充电枪很好理解——肯定要与电网,与车相连接嘛!那么小功率慢充(家用)交流充电桩要如何实现车到桩的通讯,并完成充电控制的呢?

我们先简单看一下国标的GB/T 20234系列协议标准描述,如下图所示:


从上图的示意图我们可以清晰地看到CP引线连接到充电桩的PWM波发生器,其为电力传输的控制信号线。连接线有了,那它具体是如何控制的呢?我们接着往下看:

对于家庭普通随车充,即使用市电,墙插座为取电来源时,一般PWM波的占空比为15%。通过对上表数据的分析,可以计算得出来充电电流约为9A,即充电功能约为1980W。如果使用空调等16A插座,则需要调整PWM占空比为25%,以增加充电功率。

理论学习我们已经完成,动手实践的环节来了。

首先,我们看一下默认镜像系统中是否包含了PWM波驱动。
cd /sys/class/pwm
ls

结果有点意外,镜像里面没有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命令
将编译完成后的dtb文件上传到开发板上,并重启
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一下编译环境哟!













使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:嵌入式技术专家
简介:热爱开源,乐于分享。在嵌入式技术领域里面,主攻通讯协议,Modbus,TCP/IP以及虚拟化和RTOS

9

主题

311

帖子

2

粉丝