树莓派输出较稳定PWM波的一种思路
王诗文1邢铖2
1.曙光工作室,北京信息科技大学2.北京信息科技大学
Aurora7012 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);    
}


来自 计算机电子学电子技术
2019-11-18 22:32:37
1楼

树莓派是有硬件PWM的吧

折叠评论
加载评论中,请稍候...
折叠评论
2019-11-19 00:09:13
Aurora7012(作者)
2楼
引用 radio 发表于 1 楼的内容:
树莓派是有硬件PWM的吧

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

折叠评论
加载评论中,请稍候...
折叠评论
2019-11-20 12:18:56
2019-11-20 12:18:56
3楼
引用 Aurora7012 发表于 2 楼的内容:
树莓派有两路硬件PWM,,然而我的水下机器人需要三路。。

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

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

折叠评论
加载评论中,请稍候...
折叠评论
4楼

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

折叠评论
加载评论中,请稍候...
折叠评论
Aurora7012(作者)
5楼
引用 0x00000000 发表于 3 楼的内容:
一个如此强大的MPU,里面的定时器PWM硬件只有两个?不可能吧?随便一块ARM的MCU就不止了。

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

折叠评论
加载评论中,请稍候...
折叠评论
Aurora7012(作者)
6楼
引用 0x00000000 发表于 4 楼的内容:
而且软件PWM为啥要不停死循环占用CPU核心。你使用一个定时器周期产生时隙,在中断中计数和进行IO反.....

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

折叠评论
加载评论中,请稍候...
折叠评论
2019-11-30 23:44:05
2019-11-30 23:44:05
7楼

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

折叠评论
加载评论中,请稍候...
折叠评论
2019-12-03 12:10:53
2019-12-3 12:10:53
Aurora7012(作者)
8楼

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

折叠评论
加载评论中,请稍候...
折叠评论

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

插入资源
全部
图片
视频
音频
附件
全部
未使用
已使用
正在上传
空空如也~
上传中..{{f.progress}}%
处理中..
上传失败,点击重试
{{f.name}}
空空如也~
(视频){{r.oname}}
{{selectedResourcesId.indexOf(r.rid) + 1}}
ID:{{user.uid}}
{{user.username}}
{{user.info.certsName}}
{{user.description}}
{{format("YYYY/MM/DD", user.toc)}}注册,{{fromNow(user.tlv)}}活动
{{submitted?"":"投诉"}}
请选择违规类型:
{{reason.description}}
支持的图片格式:jpg, jpeg, png