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


radio
1年5个月前
1楼

树莓派是有硬件PWM的吧

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

%7B%22isDisplay%22%3Atrue%7D

仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。

插入资源
全部
图片
视频
音频
附件
全部
未使用
已使用
正在上传
空空如也~
上传中..{{f.progress}}%
处理中..
上传失败,点击重试
等待中...
{{f.name}}
空空如也~
(视频){{r.oname}}
{{selectedResourcesId.indexOf(r.rid) + 1}}
处理中..
处理失败
插入表情
我的表情
共享表情
Emoji
上传
注意事项
最大尺寸100px,超过会被压缩。为保证效果,建议上传前自行处理。
建议上传自己DIY的表情,严禁上传侵权内容。
点击重试等待上传{{s.progress}}%处理中...已上传
空空如也~
草稿箱
加载中...
此处只插入正文,如果要使用草稿中的其余内容,请点击继续创作。
{{fromNow(d.toc)}}
{{getDraftInfo(d)}}
标题:{{d.t}}
内容:{{d.c}}
继续创作
删除插入插入
{{forum.displayName}}
{{forum.countThreads}}
篇文章,
{{forum.countPosts}}
条回复
{{forum.description || "暂无简介"}}
ID: {{user.uid}}
学术分隐藏
{{submitted?"":"投诉或举报"}}
请选择违规类型:
{{reason.description}}
支持的图片格式:jpg, jpeg, png
插入公式
分享回复:{{shareId}}
加载中...
评论控制
加载中...
文号:{{pid}}
加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
加入关注取消关注
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
建议修改
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}
下载资料
{{fileName}}
大小:{{size}}
下载当前附件将花费 {{costMessage}}
{{description}}
你当前剩余 {{holdMessage}}
{{fileName}}
大小:{{size}}
当前附件免费。
你已购买过此附件,下载当前附件不需要花费积分。
加载中...
{{errorInfo}}
附件已丢失
当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}