我们采用树莓派产生了PWM信号输出之后,下一步就是要在这个基础上进行扩展,我们希望树莓派可以产生多路的PWM信号用于控制多个电调电机,比如制作一个四旋翼无人机。其实学会了产生一路PWM信号之后,多路PWM信号就没有什么困难的了,无非就是设置多个GPIO引脚来生成PWM而已。假设我们需要产生4路PWM信号用于控制4个电机,但是我们不能把这4路PWM信号的生产代码放在一个循环里,像这样(错误):
//初始化WiringPi
wiringPiSetup();
//设置引脚为输出
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
while(1)
{
digitalWrite(1, HIGH);
usleep(1000);
digitalWrite(1, LOW);
usleep(1000);
digitalWrite(2, HIGH);
usleep(1500);
digitalWrite(2, LOW);
usleep(500);
digitalWrite(3, HIGH);
usleep(1800);
digitalWrite(3, LOW);
usleep(200);
digitalWrite(4, HIGH);
usleep(1900);
digitalWrite(4, LOW);
usleep(100);
}
因为4个引脚的PWM值都是不一样的,所以不能写在一个循环里。我们必需要在树莓派中创建4个线程,分别来生成4路不同值的PWM信号(多线程是由操作系统创建和调度,在用户使用级别下认为多线程之间都是并行的,但实际不是)。下而我们就来编写一个用于产生四路PWM信号的程序:
#include <wiringPi.h>
//定义PWM周期
#define PWM_WIDTH (2000)
int main(int argc, char *argv[])
{
void pwm_maker(int pin, int value);
void pwm_maker1(int *value);
void pwm_maker2(int *value);
void pwm_maker3(int *value);
void pwm_maker4(int *value);
//4路pwm初始值
int pwm_value1 = 1000;
int pwm_value2 = 1000;
int pwm_value3 = 1000;
int pwm_value4 = 1000;
//初始化WiringPi
wiringPiSetup();
//设置引脚为输出
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pthread_t pth1;
pthread_t pth2;
pthread_t pth3;
pthread_t pth4;
//创建4个线程用于产生4路pwm信号
pthread_create(&pth1, NULL, (void *) &pwm_maker1, (void * (*)(void *)) &pwm_value1);
pthread_create(&pth2, NULL, (void *) &pwm_maker2, (void * (*)(void *)) &pwm_value2);
pthread_create(&pth3, NULL, (void *) &pwm_maker3, (void * (*)(void *)) &pwm_value3);
pthread_create(&pth4, NULL, (void *) &pwm_maker4, (void * (*)(void *)) &pwm_value4);
while (1)
{
//接受输入,调整4路pwm的值
//do something ...
usleep(1000 * 1000);
}
}
inline void pwm_maker(int pin, int value)
{
while (1)
{
//持续高电平
digitalWrite(pin, HIGH);
usleep(value);
//持续低电平
digitalWrite(pin, LOW);
usleep(PWM_WIDTH - value);
}
}
void pwm_maker1(int *value)
{
pwm_maker(1, *value);
}
void pwm_maker2(int *value)
{
pwm_maker(2, *value);
}
void pwm_maker3(int *value)
{
pwm_maker(3, *value);
}
void pwm_maker4(int *value)
{
pwm_maker(4, *value);
}
上述程序中有很多地方书写了类似的代码,比如定义了4个变量用于存放pwm的值,定义了4个产生pwm信号的函数等,这样做是为了让读者能够清楚的看到多路pwm产生的过程,而在实际代码中我们可以使用数组和结构体指针的方式来使代码变的更加简洁美观。
Copyright © 2015-2023 问渠网 辽ICP备15013245号