gpt4 book ai didi

c++ - Raspberry Pi,C++计时功能,对值的运算?

转载 作者:行者123 更新时间:2023-12-01 15:11:02 24 4
gpt4 key购买 nike

我从C++开始,并具有“chrono”功能,我想用它来获取电动机的速度。

为此,我有一个与电机相连的编码轮,一个光耦合器用于收集编码轮产生的平方信号。

因此,我的树莓派会收到一个平方信号,该信号的速度取决于电机的速度。

我使用计时功能来尝试计算方波信号频率的持续时间。
我实现了每个信号的持续时间(几乎)为7ms。
我想简单地通过公式1 / F提取频率(因此,1 / 0.007 = 142.85)。

我已经吃了chrono函数的文档了一个星期,但我还是一无所获...

显然,所有答案都在这里,但我不明白,我仍然是C++的初学者:( https://en.cppreference.com/w/cpp/chrono

这确实非常有用,但有其局限性:https://www.code57.com/cplusplus-programming-beginners-tutorial-utilities-chrono/

如果我理解正确,则7ms的“值”存储在一个“对象”中...
我怎样才能简单地将其取出并放入标准变量中,以便对它进行除法,乘法和做我想做的事情?

这是C++代码最有趣的部分:

#include <iostream>
#include <wiringPi.h>
#include <cstdio>
#include <csignal>
#include <ctime>
#include <chrono>

// global flag used to exit from the main loop
bool RUNNING = true;
bool StartTimer = false;
//int timer = 0;
std::chrono::steady_clock::time_point BeginMeasurement; //chrono variable representing the beginning of the measurement of a motor speed


//some more code in here, but nothing exceptionnal, just calling the interruption when needed


//interruption function for counting the motor speed
void RPMCounter(){
using namespace std;
using namespace std::chrono;

if (StartTimer == true){
StartTimer = false;
steady_clock::duration result = steady_clock::now()-BeginMeasurement;
if (duration_cast<milliseconds>(result).count() < 150){
double freq;
//cout.precision(4);
std::cout << "Time = " << duration_cast<milliseconds>(result).count() << " ms" << '\n';
// I would like the next line to work and give me the frequency of the detection...
freq = 1/(duration_cast<milliseconds>(result).count()/1000);
std::cout << "Frequency = " << freq << " Hz" << '\n';
}
}
else{
BeginMeasurement = steady_clock::now();
StartTimer = true;
}
}

这是命令提示符中的结果:

enter image description here

因为我停止了电动机,所以7ms的值增加了,因此,它的旋转速度变慢,直到停止为止;)

编辑:

感谢Howard Hinnant和Ted Lyngmo,我的代码现在看起来像这样:

void RPMCounter(){
using namespace std;
using namespace std::chrono;

if (StartTimer == true){
StartTimer = false;
duration<double> result = steady_clock::now() - BeginMeasurement;
if (result < milliseconds{150}){
double freq;//= 1s / result;
//cout.precision(4);
std::cout << "Time = " << duration_cast<milliseconds>(result).count() << " ms" << '\n';
freq = (1.0/(duration<double>{result}.count()/1000))/1000;
std::cout << "Frequency = " << freq << " Hz" << '\n';
}
}
else{
BeginMeasurement = steady_clock::now();
StartTimer = true;
}
}

似乎给了我正确的频率。
作为一个初学者,我一定会在一段时间内更好地理解所有这些并加以改进:)
(基本上,我不确定我写的意思是……,例如“::”和其他方式:)
我的其余编码应该更基础,并让我学习C++的所有调整

最佳答案

我将result设为基于double的持续时间:

auto BeginMeasurement = std::chrono::steady_clock::now(); 

// some work

// a double based duration
std::chrono::duration<double> result = std::chrono::steady_clock::now() - BeginMeasurement;

然后可以将 duration 1s除以 result以得到频率:
using namespace std::chrono_literals;

double freq = 1s / result;
std::cout << freq << " Hz\n";

Howard Hinnant指出,从C++ 14开始,您可以通过将红利从基于整数的持续时间 1s更改为基于 double 的持续时间 1.0s,并使用 result推导 auto来使自己更容易:
auto result = std::chrono::steady_clock::now() - BeginMeasurement;
double freq = 1.0s / result;

Demo

关于c++ - Raspberry Pi,C++计时功能,对值的运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59956776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com