[原创] 【Luckfox幸狐 RV1106 Linux 开发板测评】七、PWM控制——Python和设备树方式

sonicfirr   2024-2-1 21:10 楼主

本人【Luckfox幸狐 RV1106 Linux 开发板测评】帖子链接:

一、开箱及测试

二、SDK获取与编译镜像

三、GPIO点灯

四、通过PC机共享网络接入Internet和Ubuntu下Python点灯

五、编译Buildroot系统并测试摄像头

六、PWM控制——命令和C方式

 

上篇测评做了控制台命令控制PWM点亮LED,并利用C程序实现了呼吸灯效果,本篇测评继续以Python和设备树方式进行实现。

1、Python控制PWM

基于Luckfox SDK编译的Buildroot镜像包含Python3,而且已经附带了python-periphery库,直接使用此库即可完成Linux系统下的外围驱动。相应代码由Luckfox Wiki提供,依然使用PWM10。

# 导入periphery.PWM库
from periphery import PWM
import time

# 创建一个PWM对象,使用PWM chip-10,channel-0
pwm = PWM(10, 0)

try:
    # 设置PWM的频率为1000Hz
    pwm.frequency = 1000
    # 设置PWM的初始占空比为0
    pwm.duty_cycle = 0
    # 设置PWM的极性为正常
    pwm.polarity = "normal"
    # 启用PWM输出
    pwm.enable()

    # 定义方向变量,初始值为1,表示增加占空比的方向
    direction = 1

    # 无限循环,持续改变PWM的占空比
    while True:
        # 每次循环增加或减少占空比0.01,具体方向由direction变量决定
        pwm.duty_cycle += 0.01 * direction
        # 保留两位小数,确保占空比的精度
        pwm.duty_cycle = round(pwm.duty_cycle, 2)
        # 当占空比达到1时,改变方向为减少占空比
        if pwm.duty_cycle == 1.0:
            direction = -1
        # 当占空比达到0时,改变方向为增加占空比
        elif pwm.duty_cycle == 0.0:
            direction = 1

        # 每次循环后暂停0.05秒,控制PWM的速度变化
        time.sleep(0.05)

# 当用户按下Ctrl+C时,捕获键盘中断异常并退出循环
except KeyboardInterrupt:
    pass

# 不论程序是否正常结束,最后都要关闭PWM通道以释放资源
finally:
    pwm.close()

 

image-20240201210846-1.png  

图7-1 pwm.py推送到开发板并执行

 

2、修改设备文件开启PWM0

文档PWM篇中提到开发板默认开启的是PWM10,Pro Max板对应管脚GPIO1_C6_d,同时还给出修改设备文件的方法,用以开启其它管脚的PWM功能。

SDK中RV1106相关的设备文件有很多,大胆盲猜一下,应该是“rv1106g-luckfox-pico-pro-max.dts”。不过为了稳妥,还是依照文档方法通过查看配置文件的相关设置值来确定板子对应的设备文件。因为是Pro Max NAND Flash上的Buildroot系统,所以配置文件是“../luckfox-pico/project/cfg/BoardConfig_IPC/BoardConfig-SPI_NAND-Buildroot-RV1106_Luckfox_Pico_Pro_Max-IPC.mk”。文件的第四项即是设备文件名称:

 

image-20240201210846-2.png  

图7-2 rv1106相关设备文件

 

image-20240201210846-3.png  

图7-3 配置文件可以看到Pro Max板对应的设备文件

 

另外,从管脚图上可以看到PWM0和I2C3_SDA是同一管脚,所以编辑设备文件时需要注释掉I2C3的代码(因为默认是开启I2C3的),然后添加PWM0的代码(文件实际注释了相关代码,去掉注释即可)。这里要注意管脚图上看到Pro Max板是PWM0_M1,设备文件管脚有m0和m1,不要错选成m0了。

 

image-20240201210846-4.png  

图7-4 PWM0和I2C3共用管脚

 

image-20240201210846-5.png  

 

image-20240201210846-6.png  

图7-5 设备文件的修改方法

 

修改并保存设备文件后,回到SDK的根路径,接着还是编译内核的过程:./build.sh lunch-->选择8(对应Pro Max)-->./build.sh。因为前面编译过整个系统(当时花费3小时),这次再做build,短短几分钟就好了——文档说是./build.sh kernel即只编译内核,本人忘记加kernel参数,但是也只用了不到10分钟就编译完成。

接着还是将镜像从虚拟机拷贝到本机,再利用工具SocToolKit烧写到开发板,之后重启开发板ADB进入控制台,执行命令ls -l /sys/class/pwm得到:

 

image-20240201210846-7.png  

图7-6 更新设备树后看到PWM0

 

如果要测试程序,只要把前面的Python代码中,pwm的实例定义修改一下构造函数传参为PWM(0, 0)即可。

 

image-20240201210846-8.png  

图7-7 修改Python代码

 

 

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复