环境
在电机只有电流环的情况下,从上层施加一个正弦的激励信号,取出信号数据和电机反馈数据,求解bode图。(该方式得出的bode图应该是电流闭环加电机的伯德图)
正弦激励信号的产生
下面是我根据需要的信号(我用的是正弦频率变化的激励曲线),按照elmo驱动器的扫频输入来写的一个信号。该信号频率越来越快,但是幅值固定,使用时候可以根据不同的频率段来修改不同的幅值,加大扫频中信噪比
代码
.
int main()
{
int start_freq = 5; // 起始频率的实际值
int end_freq = 1250; // 结束频率的实际值
int num_points = 100; // 希望生成的点数
int sample_rate = 10000; //采样率
double log_start = log10(start_freq);
double log_end = log10(end_freq);
for (int i = 0; i < num_points; i++)
{
double log_freq = log_start + (log_end - log_start) * i / (num_points - 1);
double freq = pow(10, log_freq);
double duration = 10 / freq; // 每个频率持续1周期
int n = (int)(sample_rate * duration);
//double* sine_wave = (double*)malloc(n * sizeof(double));
double step = (duration - 0) / (n - 1);
for (int t = 0; t < n; t++)
{
double sine_wave = sin(2 * PI * freq * t * step);
printf("%1f\n",sine_wave);
}
//free(sine_wave);
}
return 0;
数据处理分析
因为我们最终是需要得到波形图分析,所以在有了输入和输出之后还得做一些变换来得出结果。
下面分享一下自己的思路(得到的波形图很奇怪):
这里博主设置了100个点,num_points = 100,刚开始我是直接把所有的输入,也就是正弦激励和对应的电机位置反馈全部拉出来,做FFT变换,把得到的幅值和相位分别做比和差(幅值比和相位差),然后把横坐标转成log频率,纵坐标转换成DB单位,画bode图。有个缺点,数据量太大,有些不需要的数据也呈现在了图像中。
之后又重新尝试了另一种方式:
把这100个点中每个点对应的数据拉出来做FFT,取最大值,分别取出这100个点的最大值,然后根据最大值的索引,把那个点的FFT结果拉出来做幅值比和相位差,画出bode,这个方式试了下波形图更奇怪了。