加载中
加载中
表情图片
评为精选
鼓励
加载中...
分享
加载中...
文件下载
加载中...
修改排序
加载中...
树莓派输出较稳定PWM波的一种思路
王诗文1邢铖2
1.曙光工作室,北京信息科技大学2.北京信息科技大学
言文寺2019/11/18原创 计算机电子学电子技术 IP:北京
关键词
树莓派方波
PWM
Other
#include "Pwm.h"     #include <wiringpi.h>     #include <iostream>     using namespace std;     void* __loop__(void* data)     {     Pwm* pwm = (Pwm*)data;     unsigned long nextTime = micros() + pwm->highTime; //设置一个时间节点     bool mode_high = true;     digitalWrite(pwm->pin, HIGH);     while (1)     {     if (!pwm->running)     continue;     unsigned long current = micros();     if (current >= nextTime) //如果当前时间已经大于节点时间,反转电平同时设置新的时间节点     {     if (mode_high)     {     mode_high = false;     nextTime = micros() + pwm->totalTime - pwm->highTime;     digitalWrite(pwm->pin, LOW);     }     else     {     mode_high = true;     nextTime = micros() + pwm->highTime;     digitalWrite(pwm->pin, HIGH);     }     }     }     //为何不用四行的方波输出?因为实测发现digitalWrite耗时不可忽略!同样都是100%的CPU核心占用,这样的效果更好一点...     return nullptr;     }     void Pwm::start()     {     pthread_attr_t attr;     pthread_attr_init(&attr);     pthread_attr_setschedpolicy(&attr, SCHED_RR);     sched_param p;     p.sched_priority = 10//线程优先级10     pthread_attr_setschedparam(&attr, &p);     pthread_create(&thread, &attr, __loop__, this);     pthread_attr_destroy(&attr);     running = true;     }     void Pwm::wpiinit()     {     pinMode(pin, OUTPUT);     }</iostream></wiringpi.h>


新版本公告
~~空空如也
zx-16533
5年7个月前 IP:广东
866391

树莓派是有硬件PWM的吧

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
言文寺作者
5年7个月前 IP:北京
866394
引用zx-16533发表于1楼的内容
树莓派是有硬件PWM的吧

树莓派有两路硬件PWM,,然而我的水下机器人需要三路。。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
0x00000000
5年7个月前 IP:海南
866448
引用言文寺发表于2楼的内容
树莓派有两路硬件PWM,,然而我的水下机器人需要三路。。

一个如此强大的MPU,里面的定时器PWM硬件只有两个?不可能吧?

随便一块ARM的MCU就不止了。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
0x00000000
5年7个月前 IP:海南
866449

而且软件PWM为啥要不停死循环占用CPU核心。你使用一个定时器周期产生时隙,在中断中计数和进行IO反转就行了?

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
言文寺作者
5年7个月前 IP:北京
866452
引用0x00000000发表于3楼的内容
一个如此强大的MPU,里面的定时器PWM硬件只有两个?不可能吧?随便一块ARM的MCU就不止了。

目前查到的是有两个,,所以直接选用了文章中提到的方案。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
言文寺作者
5年7个月前 IP:北京
866453
引用0x00000000发表于4楼的内容
而且软件PWM为啥要不停死循环占用CPU核心。你使用一个定时器周期产生时隙,在中断中计数和进行IO反...

这个思路我再研究下,,还真没想到这一点,当时比赛时间太紧了。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
yuchouxuan
5年7个月前 IP:河北
866827

如果空间,供电允许的话,还是建议加一块FPGA做这些事情,一是gpio虽然方便,但是回头控制的东西多了还是不够用。二是FPGA控制采集都可以做成并行的效率更高。三是产生特定波形更稳定,方便,频率也高。真的,值得拥有

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
言文寺作者
5年6个月前 IP:北京
866952

可以考虑,现在考虑的方案之一是树莓派+微雪的舵机控制板

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

言文寺
进士 机友 笔友
文章
2
回复
27
学术分
0
2019/08/30注册,2年3个月前活动

自娱自乐

主体类型:个人
所属领域:无
认证方式:身份证号
IP归属地:未同步
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的