sweep signal

环境

在电机只有电流环的情况下,从上层施加一个正弦的激励信号,取出信号数据和电机反馈数据,求解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,这个方式试了下波形图更奇怪了。

有小伙伴这样尝试过这种扫频求bode方式吗?
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值