树莓派是有硬件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控制采集都可以做成并行的效率更高。三是产生特定波形更稳定,方便,频率也高。真的,值得拥有
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |
200字以内,仅用于支线交流,主线讨论请采用回复功能。