瑞芯微Rockchip开发者社区
直播中

费炜

1年用户 37经验值
擅长:嵌入式技术
私信 关注
[经验]

【LuckFox Pico开发板免费试用】PWM控制呼吸灯教程

1 LuckFox Pico引脚分布

LuckFox Pico的引脚分布如下图,本次实验只关注PWM引脚。选择PWM0_M1来控制LED灯的循环亮灭。

wKgaomVAZ3KAIo1bAANPFav56xY821.png

2 PWM控制代码

1、在虚拟机上新建文件夹“myprogram”,并新建C语言脚本,命名为“pwm.c”,如下图:

wKgZomVAaNGACM-aAAHHKGfcy2E248.png

编写控制代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define PWM_PATH "/sys/class/pwm/pwmchip0" //PWM路径
#define PERIOD_NS 1000000 //周期(ns)
#define MIN_DUTY_CYCLE_NS 0 //最小占空比0
#define MAX_DUTY_CYCLE_NS 1000000 //最大占空比100

int main() {
FILE *pwm_export = fopen(PWM_PATH "/export", "w");
if (!pwm_export) {
perror("Failed to open PWM export");
return 1;
}
fprintf(pwm_export, "0"); //写入设备索引(通常为0),以导出指定的PWM通道供用户空间控制
fclose(pwm_export);

FILE *period_file = fopen(PWM_PATH "/pwm0/period", "w");
if (!period_file) {
perror("Failed to open PWM period");
return 1;
}
fprintf(period_file, "%d", PERIOD_NS); //写入周期值 “1000000”(以纳秒为单位),以设置PWM的周期为1KHZ。
fclose(period_file);

FILE *enable_file = fopen(PWM_PATH "/pwm0/enable", "w"); //enable使能文件写入"1",以启用PWM信号的输出。
if (!enable_file) {
perror("Failed to open PWM enable");
return 1;
}
fprintf(enable_file, "1");
fclose(enable_file);

int direction = 1; // 1 for increasing duty cycle, -1 for decreasing
int duty_cycle_ns = 0;

while (1) {
duty_cycle_ns += 10000 * direction;
if(duty_cycle_ns == MAX_DUTY_CYCLE_NS)
direction = -1;
else if(duty_cycle_ns == MIN_DUTY_CYCLE_NS)
direction = 1;

FILE *duty_cycle_file = fopen(PWM_PATH "/pwm0/duty_cycle", "w");
if (!duty_cycle_file) {
perror("Failed to open PWM duty cycle");
return 1;
}
fprintf(duty_cycle_file, "%d", duty_cycle_ns); //写入占空比值,whilex循环不断改变duty_cycle_ns的值,实现PWM占空比从0% // 渐增加到100%,然后再从100%逐渐减小到0%的呼吸灯效果
fclose(duty_cycle_file);

usleep(50000); // Adjust this value for desired breathing speed,延时50000ns,控制呼吸的速度
}

FILE *pwm_unexport = fopen(PWM_PATH "/unexport", "w");
if (!pwm_unexport) {
perror("Failed to open PWM unexport");
return 1;
}
fprintf(pwm_unexport, "0"); //写入设备索引,取消导出指定的PWM通道到用户空间。
fclose(pwm_unexport);

return 0;
}

2、用交叉编译工具链编译pwm.c文件,命令如下:

“arm-rockchip830-linux-uclibcgnueabihf-gcc pwm.c -o pwm”

官方提供的虚拟机已配置好交叉编译环境,此处不用再配置。生成pwm可执行文件,如下图:

wKgZomVAajaAWyD9AAFMZjx4dUQ829.png

3 修改设备树

1、Luckfox pico 设备树文件路径如下:

/home/luckfox/Luckfox-Pico/luckfox-pico/sysdrv/source/kernel/arch/arm/boot/dts

wKgZomVAczqAa8_UAAI5P7YYW6Q324.png

2、开启PWM0_M0。需要修改rv1103g-luckfox-pico.dts文件,注释掉pwm0m0,启用pwm0m1。如下图:

wKgZomVAc--ANaFyAACwCwScniI728.png

因为PWM0_M1(GPIO1_D2_d) 默认功能为 I2C3 功能,所以需要在设备树中注释掉 I2C3的代码片段。如下图:

wKgaomVAdISAJ7BfAACeFWtnfAE763.png

4 编译内核

1、选择编译分支。cd 到/home/luckfox/Luckfox-Pico/luckfox-pico路径。运行“./build.sh luch”。0对应的是Luckfox pico分支,1对应的是Luckfox pico plus分支。 这里选择0。如下图:

wKgZomVAdYmAZwsGAAKhJ1aIxo8230.png

2、重新编译内核kernel。运行“./build.sh kernel”命令。

wKgaomVAdhGATOTvAAFRNJrGfDo847.png

3、重新烧录固件

内核编译完成后会在/home/luckfox/Luckfox-Pico/luckfox-pico/output/image路径下生成boot.img,env.txt等文件,默认会替换掉源文件。

重新烧录SD卡。选择烧录上一步刚生成的boot.img,其他img文件可保持不变。如下图:

wKgaomVAeFiAVMThAAGiCGNRMuA588.png

5 运行代码

1、通过adb指令将生成的pwm可执行文件上传到Luckfox pico开发板上。

wKgaomVAauyAS8GDAABDq6bkYCc224.png

2、修改pwm可执行文件的权限,然后运行。

wKgZomVAbF-AahLxAAAqWKmObo8118.png

3、LED灯正极接开发板“1D2_D”引脚,负极接“GND”。可以观察到LED灯逐渐变亮,然后逐渐熄灭,之后又逐渐变亮,如此循环。

如下图,逐渐变亮:

wKgZomVAbcSAMIvYAB3eN7sjMrw240.png

逐渐变暗:

wKgZomVAbf6AU-ecABoqv9Io5dk718.png

实验成功。

更多回帖

发帖
×
20
完善资料,
赚取积分