PI-PLL锁相环+低通滤波器 C语言
时间: 2023-07-08 21:41:25 浏览: 273
PLL 锁相环 仿真 C代码实现,经过验证的锁相环仿真与C语言实现
5星 · 资源好评率100%
以下是一个基于C语言的PI-PLL锁相环加低通滤波器估算法的示例代码:
```
#include <stdio.h>
#include <math.h>
#define PI 3.141592653589793
/* 下面是锁相环参数 */
double Kp = 0.1; // 比例增益
double Ki = 0.01; // 积分增益
double K = 1; // 除数
double N = 100; // 采样数
double f_ref = 50; // 参考频率
double f_in = 45; // 输入频率
double phase_err = 0; // 初始相位误差
double angle_out = 0; // 输出角度
/* 下面是低通滤波器参数 */
double R = 1000; // 电阻值
double C = 1e-6; // 电容值
double Vdd = 5; // 电源电压
double Vout = 0; // 输出电压
double Vout_last = 0; // 上一次的输出电压
double low_pass_filter(double input)
{
double alpha = 1 / (1 + R * C);
Vout = alpha * input + (1 - alpha) * Vout_last;
Vout_last = Vout;
return Vout;
}
int main()
{
double phase_err_sum = 0;
double phase_err_last = 0;
double phase_err_curr = 0;
double delta_angle = 0;
double delta_time = 1 / f_ref;
for (int i = 0; i < N; i++)
{
phase_err_curr = (2 * PI * f_in * delta_time * i) + phase_err;
phase_err_sum += phase_err_curr;
delta_angle = Kp * phase_err_curr + Ki * phase_err_sum + phase_err_curr - phase_err_last;
angle_out += delta_angle / K;
phase_err_last = phase_err_curr;
}
double filtered_angle = low_pass_filter(angle_out);
printf("输出角度: %lf\n", filtered_angle * 180 / PI);
return 0;
}
```
代码中,通过给定锁相环的参数,计算输入频率和参考频率之间的相位误差,并通过比例增益和积分增益计算误差修正量,最终得到锁相环的输出角度。同时,将输出角度输入到低通滤波器中,通过电阻和电容的组合来实现对输出信号的滤波,最终得到锁相环输出信号的稳定值。注意这里的输出角度是弧度制,需要将其转换为角度制才能进行实际应用。
阅读全文