#include <stdio.h>
#include <stdlib.h>
void pwm_init(int chip, int channel)
{
char path[64];
snprintf(path, sizeof(path), "/sys/class/pwm/pwmchip%d/export", chip);
FILE *f = fopen(path, "w");
if (f) {
fprintf(f, "%d", channel);
fclose(f);
}
usleep(100000); // 等待创建
}
void pwm_set_period(int chip, int channel, unsigned int period_ns)
{
char path[64];
snprintf(path, sizeof(path),
"/sys/class/pwm/pwmchip%d/pwm%d/period", chip, channel);
FILE *f = fopen(path, "w");
if (f) {
fprintf(f, "%u", period_ns);
fclose(f);
}
}
void pwm_set_duty(int chip, int channel, unsigned int duty_ns)
{
char path[64];
snprintf(path, sizeof(path),
"/sys/class/pwm/pwmchip%d/pwm%d/duty_cycle", chip, channel);
FILE *f = fopen(path, "w");
if (f) {
fprintf(f, "%u", duty_ns);
fclose(f);
}
}
void pwm_enable(int chip, int channel, int enable)
{
char path[64];
snprintf(path, sizeof(path),
"/sys/class/pwm/pwmchip%d/pwm%d/enable", chip, channel);
FILE *f = fopen(path, "w");
if (f) {
fprintf(f, "%d", enable);
fclose(f);
}
}
// 设置占空比百分比
void pwm_set_percent(int chip, int channel, unsigned int period_ns, float percent)
{
unsigned int duty_ns = (unsigned int)(period_ns * percent / 100.0);
pwm_set_duty(chip, channel, duty_ns);
}