文号
866374
阅读
20748
回复
9
收藏
4
树莓派输出较稳定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>


7年0个月前IP:广东
866391
1楼

树莓派是有硬件PWM的吧

引用
评论
言文寺作者
7年0个月前IP:北京
866394
2楼
引用zx-16533发表于1楼的内容
树莓派是有硬件PWM的吧

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

引用
评论
7年0个月前IP:海南
866448
3楼
引用言文寺发表于2楼的内容
树莓派有两路硬件PWM,,然而我的水下机器人需要三路。。

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

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

引用
评论
7年0个月前IP:海南
866449
4楼

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

引用
评论
言文寺作者
7年0个月前IP:北京
866452
5楼
引用0x00000000发表于3楼的内容
一个如此强大的MPU,里面的定时器PWM硬件只有两个?不可能吧?随便一块ARM的MCU就不止了。

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

引用
评论
言文寺作者
7年0个月前IP:北京
866453
6楼
引用0x00000000发表于4楼的内容
而且软件PWM为啥要不停死循环占用CPU核心。你使用一个定时器周期产生时隙,在中断中计数和进行IO反转就行了?

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

引用
评论
7年0个月前IP:河北
866827
7楼

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

引用
评论
言文寺作者
7年0个月前IP:北京
866952
8楼

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

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