msp430单片机中如何设计50Hz陷波器?

2019-03-24 09:37发布

msp430前面的ADC采样率大概是300KHz,采样后的数据进入430单片机进行数据处理,但要先滤去50Hz工频干扰,求参考代码
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
a828378
2019-03-24 21:43
< :TI_MSP430_内容页_SA7 -->
  1. #ifndef CNTL_2P2Z_F_H_
  2. #define CNTL_2P2Z_F_H_

  3. //*********** Structure Definition ********//

  4. // Second order control law using an IIR filter structure with programmable output saturation.
  5. // This macro uses CNTL_2P2Z_F structures to store coefficients & internal values.
  6. // The structures should be initialized with the supplied CNTL_2P2Z_F_INIT macro.
  7. // Within the structure the Max & Min parameters are the output bounds where as the IMin parameter
  8. // is used for saturating the lower bound while keeping an internal history.  The IMin parameter
  9. // should not be lower than -0.9.

  10. typedef struct {
  11.         // Coefficients
  12.         float32 Coeff_B2;
  13.         float32 Coeff_B1;
  14.         float32 Coeff_B0;
  15.         float32 Coeff_A2;
  16.         float32 Coeff_A1;

  17.         // Output saturation limits
  18.         float32 Max;
  19.         float32 IMin;
  20.         float32 Min;
  21. } CNTL_2P2Z_F_COEFFS;

  22. typedef struct {
  23.         float32 Out1;
  24.         float32 Out2;
  25.         // Internal values
  26.         float32 Errn;
  27.         float32 Errn1;
  28.         float32 Errn2;
  29.         // Inputs
  30.         float32 Ref;
  31.         float32 Fdbk;
  32.         // Output values
  33.         float32 Out;
  34. } CNTL_2P2Z_F_VARS;


  35. //*********** Macro Definition ***********//
  36. #define CNTL_2P2Z_F_MACRO(v, k)                                                                                                                               
  37.         /* Calculate error */                                                                                                                                       
  38.         k.Errn = k.Ref - k.Fdbk;                                                                                                                               
  39.         k.Out = (v.Coeff_A2*k.Out2) + (v.Coeff_A1 *k.Out1) + (v.Coeff_B2 *k.Errn2)                               
  40.                                         + (v.Coeff_B1 * k.Errn1) + (v.Coeff_B0 * k.Errn);                                               
  41.         /* Update error values */                                                                                                                               
  42.         k.Errn2 = k.Errn1;                                                                                                                                               
  43.         k.Errn1 = k.Errn;                                                                                                                                               
  44.         /* Determine new output */                                                                                                                               
  45.         k.Out = (k.Out < v.Max) ? k.Out : v.Max;                                                                                               
  46.         k.Out = (k.Out > v.IMin) ? k.Out : v.IMin;                                                                                               
  47.         /* Store outputs */                                                                                                                                               
  48.         k.Out2 = k.Out1;                                                                                                                                               
  49.         k.Out1 = k.Out;                                                                                                                                                       
  50.         /* Saturated output */                                                                                                                                       
  51.         k.Out = ((k.Out > v.Min) ? k.Out : v.Min);


  52. #endif /* CNTL_2P2Z_F_H_ */
复制代码我用的代码是这样的,来自TI的control SUITE的Solar LIB。
用下面的宏定义函数就可以了。两个结构体一个放了波波器的值一个放滤波参数。用之前记得两个结构体都初始化一下。
然后滤波器参数用MATLAB的fdatool生成一下就可以了。楼主可以试试看。

一周热门 更多>

相关问题

    相关文章