树莓派是有硬件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>
而且软件PWM为啥要不停死循环占用CPU核心。你使用一个定时器周期产生时隙,在中断中计数和进行IO反转就行了?
引用0x00000000发表于3楼的内容一个如此强大的MPU,里面的定时器PWM硬件只有两个?不可能吧?随便一块ARM的MCU就不止了。
目前查到的是有两个,,所以直接选用了文章中提到的方案。
引用0x00000000发表于4楼的内容而且软件PWM为啥要不停死循环占用CPU核心。你使用一个定时器周期产生时隙,在中断中计数和进行IO反...
这个思路我再研究下,,还真没想到这一点,当时比赛时间太紧了。
如果空间,供电允许的话,还是建议加一块FPGA做这些事情,一是gpio虽然方便,但是回头控制的东西多了还是不够用。二是FPGA控制采集都可以做成并行的效率更高。三是产生特定波形更稳定,方便,频率也高。真的,值得拥有
200字以内,仅用于支线交流,主线讨论请采用回复功能。