AB32VG1开发板的三路LPWM不能同时输出吗?我在程序中用3路LPWM控制全彩灯,通过控制占空比实现全彩灯,灯的颜色变化不明显,结果发现只有1路LPWM输出,是不是不支持三路LPWM同时输出呀?
我这边测试也这样 只有一路LPWM是能输出的
按板子上默认设置RGB灯的三路PWM:R是t5pwm G是lpwm0 B是lpwm1
然后我用同一个函数创建三个线程控制这三个灯的占空比变化
代码如下
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2021-07-25 Administrator the first version
*/
#include "rtthread.h"
#define PWM1_DEV_NAME "lpwm0" /* PWM 设备名称 */
struct rt_device_pwm *pwm1_dev; /* PWM 设备句柄 */
#define PWM2_DEV_NAME "lpwm1" /* PWM 设备名称 */
struct rt_device_pwm *pwm2_dev; /* PWM 设备句柄 */
#define PWM3_DEV_NAME "lpwm2" /* PWM 设备名称 */
struct rt_device_pwm *pwm3_dev; /* PWM 设备句柄 */
#define PWM4_DEV_NAME "t5pwm" /* PWM 设备名称 */
struct rt_device_pwm *pwm4_dev; /* PWM 设备句柄 */
#define PWM5_DEV_NAME "t3pwm" /* PWM 设备名称 */
struct rt_device_pwm *pwm5_dev; /* PWM 设备句柄 */
#define PWM6_DEV_NAME "t4pwm" /* PWM 设备名称 */
struct rt_device_pwm *pwm6_dev; /* PWM 设备句柄 */
typedef struct led_ctl {
struct rt_device_pwm *dev;
int ch;
int min;
int max;
}led_ctl_t;
led_ctl_t led_R,led_G,led_B;
void led_init(void)
{
pwm1_dev = (struct rt_device_pwm *)rt_device_find(PWM1_DEV_NAME);
if(pwm1_dev){
rt_pwm_set(pwm1_dev, 3, 100000, 100000);
rt_pwm_enable(pwm1_dev, 3);
}
pwm2_dev = (struct rt_device_pwm *)rt_device_find(PWM2_DEV_NAME);
if(pwm2_dev){
rt_pwm_set(pwm2_dev, 1, 100000, 100000);
rt_pwm_enable(pwm2_dev, 1);
}
pwm3_dev = (struct rt_device_pwm *)rt_device_find(PWM3_DEV_NAME);
if(pwm3_dev){
rt_pwm_set(pwm3_dev, 1, 100000, 100000);
rt_pwm_enable(pwm3_dev, 1);
}
pwm4_dev = (struct rt_device_pwm *)rt_device_find(PWM4_DEV_NAME);
if(pwm4_dev){
rt_pwm_set(pwm4_dev, 1, 100000, 100000);
rt_pwm_enable(pwm4_dev, 1);
}
pwm5_dev = (struct rt_device_pwm *)rt_device_find(PWM5_DEV_NAME);
if(pwm5_dev){
rt_pwm_set(pwm5_dev, 1, 100000, 100000);
rt_pwm_enable(pwm5_dev, 1);
}
pwm6_dev = (struct rt_device_pwm *)rt_device_find(PWM6_DEV_NAME);
if(pwm6_dev){
rt_pwm_set(pwm6_dev, 1, 100000, 100000);
rt_pwm_enable(pwm6_dev, 1);
}
// 用同一个函数创建三个线程 分别传入RGB的LED的PWM设备句柄
extern void led_thread(void *p);
rt_thread_t tid;
led_R.dev = pwm4_dev;
led_R.ch = 1;
led_R.min = 777;
led_R.max = 999;
tid = rt_thread_create("led_R", led_thread, &led_R, 512, 26, 2);//PE1
if(tid){
rt_thread_startup(tid);
}
// 绿色LED无法控制???
led_G.dev = pwm5_dev;
led_G.ch = 1;
led_G.min = 1;
led_G.max = 999;
tid = rt_thread_create("led_G", led_thread, &led_G, 512, 26, 2);//PE4
if(tid){
rt_thread_startup(tid);
}
led_B.dev = pwm2_dev;
led_B.ch = 1;
led_B.min = 777;
led_B.max = 999;
tid = rt_thread_create("led_B", led_thread, &led_B, 512, 26, 2);//PA1
if(tid){
rt_thread_startup(tid);
}
}
INIT_APP_EXPORT(led_init);
void led_thread(void *p)
{
led_ctl_t *ctl = (led_ctl_t *)p; /* PWM 设备句柄 */
int var = ctl->max;
int dir = 0;
if(ctl->dev)
while(1)
{
if(dir){
if(var < ctl->max)
var++;
else {
dir = 0;
}
}else {
if (var > ctl->min) {
var--;
}else {
dir = 1;
}
}
rt_pwm_set(ctl->dev, ctl->ch, 100000, 100*var%100000);
rt_thread_mdelay(5);
}
}
绿灯线程中传入正常的LPWM1的句柄之后绿灯的亮度就没什么变化,尝试传入t3pwm的句柄并且把绿灯接到PB0就能明显看到亮度变化
补充一个,这个大佬的仓库https://github.com/greedyhao/ab32vg1-ab-prougen里面有讲LPWM 的 G1 G2 G3 之间是互斥的,只能三选一,所以三个LED如果用PE1(t5pwm) PA1(lpwm G3) PA2(lpwm G3)三个脚发PWM的话控制起来是OK的
昨天准备尝试发四路LPWM的时候找到一个LPWM的驱动代码的BUG,楼主的问题也可能是这个原因引起的
表象是四路LPWM始终只有两路有占空比变化,观察发现是两个占空比寄存器中每个占空比寄存器中都有一路一直为0,而且偶尔重新编译下载还能换到另一个通道去,于是尝试手动写占空比寄存器,发现手动写占空比寄存器四路LPWM的占空比都有在变化,此时定位问题在驱动代码里面,然后翻出来这么一段
在drv_pwm.c中
此处写入占空比时没有考虑同时使用通道0和1与同时使用通道2和3的情况,应该改成类似这样
好的,我后面改下drv_pwm.c的驱动代码,试一下,RGB灯颜色有没有明显的变化哈