树莓派输出较稳定PWM波的一种思路
王诗文1邢铖2
1.曙光工作室,北京信息科技大学2.北京信息科技大学
言文寺2019/11/18原创 计算机电子学电子技术 IP:北京
关键词
树莓派方波
PWM
#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>


已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
zx-16533
5年2个月前 IP:广东
866391

树莓派是有硬件PWM的吧

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

自娱自乐

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

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}