Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
PWM
舵机
两路PWM控制时有一路没有反应
发布于 2021-12-20 20:03:31 浏览:1346
订阅该版
在学习pwm的时候发现一个问题,一直没有解决: 两个线程,一个线程是LED,另一个是舵机,都是用PWM控制的,单独控制都是没有问题的,综合在一起之后,首先控制舵机转一下没有问题,再控制让LED亮起来也没有问题,但是此时再去控制舵机就没有反应了,去查看了返回值舵机控制函数也执行了,但是舵机就是没有反应 能想的的情况都进行了排除验证,复现如下: 引脚选择如下: ![image.png](https://oss-club.rt-thread.org/uploads/20211220/fd90dff9ff013b3b81a6eca32171b34e.png.webp) board.h的配置如下 ![image.png](https://oss-club.rt-thread.org/uploads/20211220/55f5a44e893e13389f3462db168afbb6.png) ![image.png](https://oss-club.rt-thread.org/uploads/20211220/b25564f39bf90af3b8f77fe94afdaf03.png) pwm_config.h的配置如下 ![image.png](https://oss-club.rt-thread.org/uploads/20211220/13ce1e1ba5e477e197554c58c64c6313.png) 在下面的第三步中,如按照提示操作会报错说重复定义,于是就跳过了这一步骤 ![image.png](https://oss-club.rt-thread.org/uploads/20211220/ea4fb734fa934beaa150dcb8269c1e9a.png) 下面是LED线程的实现: ``` #define THREAD_PRIORITY 25 /* 线程优先级 */ #define THREAD_STACK_SIZE 512 /* 线程栈大小 */ #define THREAD_TIMESLICE 5 /* 线程时间片大小 */ static rt_thread_t tid2 = RT_NULL; /* 舵机线程句柄 */ #define PWM_DEV_NAME "pwm4" /* PWM设备名称 */ #define PWM_DEV_CHANNEL 2 /* PWM设备输出通道 */ struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */ static void led_entry(void *parameter) { rt_kprintf("led_entry 1\n"); rt_uint32_t period = 1000000000; /* 周期为10ms,单位为纳秒ns */ rt_uint32_t pulse = 0; /* PWM脉冲宽度值,单位为纳秒ns */ /* 查找设备 */ pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME); if (pwm_dev == RT_NULL) { rt_kprintf("led sample run failed! can't find %s device!\n", PWM_DEV_NAME); return; } rt_kprintf("led_entry 2\n"); /* 设置PWM周期和脉冲宽度默认值 */ rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse); /* 使能设备 */ rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL); while(1) { rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, 100000000); //5ms // rt_thread_mdelay(100); } rt_kprintf("led_entry 4\n"); /* step 3、如果不再使用该通道,可以关闭 PWM 通道的输出 */ rt_pwm_disable(pwm_dev, PWM_DEV_CHANNEL); rt_kprintf("led_entry 5\n"); } void led(void) { /* 创建线程,名称是 led_thread ,入口是 led_entry*/ tid2 = rt_thread_create("led_thread", led_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); /* 如果获得线程控制块,启动这个线程 */ if (tid2 != RT_NULL) rt_thread_startup(tid2); } MSH_CMD_EXPORT(led, CreatLedThreadEntry); ``` 下面是舵机线程的实现: ``` #define THREAD_PRIORITY 24 /* 线程优先级 */ #define THREAD_STACK_SIZE 512 /* 线程栈大小 */ #define THREAD_TIMESLICE 5 /* 线程时间片大小 */ static rt_thread_t tid1 = RT_NULL; /* 舵机线程句柄 */ #define PWM_DEV_NAME "pwm3" /* PWM设备名称 */ #define PWM_DEV_CHANNEL 1 /* PWM设备输出通道 */ struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */ static void pwm_entry(void *parameter) { rt_kprintf("1\n"); rt_uint32_t period = 10000000; /* 周期为0.5ms,单位为纳秒ns */ // rt_uint32_t pulse = 0; /* PWM脉冲宽度值,单位为纳秒ns */ /* 查找设备 */ pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME); if (pwm_dev == RT_NULL) { rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME); return; } rt_kprintf("2\n"); /* 设置PWM周期和脉冲宽度默认值 */ rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, 1000000);//设置默认会抖动 /* 使能设备 */ rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL); while(1) { int ret = rt_event_recv(pwm_open_event1, //接收数据集 (PWM_OPEN_EVENT_FLAGS_OPENMV|PWM_OPEN_EVENT_FLAGS_ASR|PWM_OPEN_EVENT_FLAGS_ONENET),//三个事件可以触发 RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR, //三个事件只要满足一个即可 RT_WAITING_FOREVER, //一直阻塞等待 NULL); if(ret == RT_EOK) { rt_kprintf("pwm_open_event1 succeed!\n"); } /* step 2、设置 PWM 周期和脉冲宽度,输出特定的波形 */ int rett = rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, 500000); //0.5ms rt_kprintf("3.2 :%d\n",rett); rt_thread_mdelay(1000); int rett2 = rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, 1000000); //2.5ms rt_kprintf("3.3 :%d\n",rett2); rt_err_t err=rt_sem_release(&pwm_esp_sem); if(err != RT_EOK) { rt_kprintf("pwm_entry: pwm_esp_sem released error!\r\n"); } else { rt_kprintf("pwm_entry: pwm_esp_sem released ok!\r\n"); } // } } rt_kprintf("4\n"); /* step 3、如果不再使用该通道,可以关闭 PWM 通道的输出 */ rt_pwm_disable(pwm_dev, PWM_DEV_CHANNEL); rt_kprintf("5\n"); } void CreatPwmThreadEntry(void) { /* 创建线程,名称是 pwm_thread ,入口是 pwm_entry*/ tid1 = rt_thread_create("pwm_thread", pwm_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); /* 如果获得线程控制块,启动这个线程 */ if (tid1 != RT_NULL) rt_thread_startup(tid1); } ``` 曾考虑会不会是电源的问题,也进行了排除,方法是,关闭LED的PWM通道,同时卸载LED线程,再控制舵机,但是还是没有反应,说明电源应该是没有问题的 也考虑到是线程资源问题,但是如上面提到,进行了控制台输出,控制舵机的函数rt_pwm_set是执行了的,并且返回值也是正确的,说明资源足够 比如其他的问题,同一定时器的不同通道是独立的,但是需要频率相同,所以改成了不同定时器的不同通道,此时这两个应该是完全独立的 感觉就像被LED占着,无法控制舵机了。 不知道有没有人做过,出现类似问题的
查看更多
4
个回答
默认排序
按发布时间排序
yangjie
认证专家
2021-12-21
hello
看你代码,led在msh中每输入一次 就会创建一个led线程,你需要这么多的led线程吗? pwm也有pwm的命令可以使用的,可测试一下,。具体看[文档中心设备中的pwm设备](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/pwm/pwm?id=finsh-%e5%91%bd%e4%bb%a4)可以排除一下是pwm问题还是代码问题。
南城
2021-12-21
这家伙很懒,什么也没写!
尝试一下将LED线程或者舵机线程中的device名修改一下,有可能是变量名的原因
TEGB_2174
2021-12-21
这家伙很懒,什么也没写!
问题解决,将pwm设备名称和通道名称修改成和舵机线程不一样的,就可以了 ![image.png](https://oss-club.rt-thread.org/uploads/20211221/f4eccc1976c294353108337cc043ae73.png) 但是,两个线程分属不同的文件,命名相同与否应该没有区别
小小李sunny
2021-12-21
这家伙很懒,什么也没写!
你这两个线程都是通过msh命令来创建的吧,控制台调用msh命令创建后,线程已经存在并运行了,led线程会一直设定一个固定的占空比,舵机会在等待事件,如果没有事件发生就不会有下面的执行。 此时再次调用msh命令来创建这两个中的无论哪一个线程都是创建失败,没有用的。
撰写答案
登录
注册新账号
关注者
0
被浏览
1.3k
关于作者
TEGB_2174
这家伙很懒,什么也没写!
提问
2
回答
1
被采纳
0
关注TA
发私信
相关问题
1
玩iot camera笔记之3测试试用3路pwm
2
[已解决]PWM输出异常分析
3
给RT-Thread添加PWM驱动框架
4
关于rt-thread-3.1.0 pwm
5
关于rt-thread的PWM框架在stm32f103vf应用的疑问
6
rt-thread stm32 bsp adc pwm 外设适配好了吗
7
stm32f103ze 添加pwm 设备失败
8
【正点原子】潘多拉IoT-STM32L475开发板 用menuconfig 看不到PWM....
9
关于rtthread 4.0.0版本中pwm的初始化定时器寄存器读写问题
10
RT-Thread正点原子战舰V3使用PWM设备驱动没有输出
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
7
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部