3805|3

67

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

msp430单片机中如何设计50Hz陷波器? [复制链接]

msp430前面的ADC采样率大概是300KHz,采样后的数据进入430单片机进行数据处理,但要先滤去50Hz工频干扰,求参考代码

最新回复

#ifndef CNTL_2P2Z_F_H_ #define CNTL_2P2Z_F_H_ //*********** Structure Definition ********// // Second order control law using an IIR filter structure with programmable output saturation. // This macro uses CNTL_2P2Z_F structures to store coefficients & internal values. // The structures should be initialized with the supplied CNTL_2P2Z_F_INIT macro. // Within the structure the Max & Min parameters are the output bounds where as the IMin parameter // is used for saturating the lower bound while keeping an internal history.  The IMin parameter // should not be lower than -0.9. typedef struct {         // Coefficients         float32 Coeff_B2;         float32 Coeff_B1;         float32 Coeff_B0;         float32 Coeff_A2;         float32 Coeff_A1;         // Output saturation limits         float32 Max;         float32 IMin;         float32 Min; } CNTL_2P2Z_F_COEFFS; typedef struct {         float32 Out1;         float32 Out2;         // Internal values         float32 Errn;         float32 Errn1;         float32 Errn2;         // Inputs         float32 Ref;         float32 Fdbk;         // Output values         float32 Out; } CNTL_2P2Z_F_VARS; //*********** Macro Definition ***********// #define CNTL_2P2Z_F_MACRO(v, k)                                                                                                                                \         /* Calculate error */                                                                                                                                        \         k.Errn = k.Ref - k.Fdbk;                                                                                                                                \         k.Out = (v.Coeff_A2*k.Out2) + (v.Coeff_A1 *k.Out1) + (v.Coeff_B2 *k.Errn2)                                \                                         + (v.Coeff_B1 * k.Errn1) + (v.Coeff_B0 * k.Errn);                                                \         /* Update error values */                                                                                                                                \         k.Errn2 = k.Errn1;                                                                                                                                                \         k.Errn1 = k.Errn;                                                                                                                                                \         /* Determine new output */                                                                                                                                \         k.Out = (k.Out < v.Max) ? k.Out : v.Max;                                                                                                \         k.Out = (k.Out > v.IMin) ? k.Out : v.IMin;                                                                                                \         /* Store outputs */                                                                                                                                                \         k.Out2 = k.Out1;                                                                                                                                                \         k.Out1 = k.Out;                                                                                                                                                        \         /* Saturated output */                                                                                                                                        \         k.Out = ((k.Out > v.Min) ? k.Out : v.Min); #endif /* CNTL_2P2Z_F_H_ */ 复制代码我用的代码是这样的,来自TI的control SUITE的Solar LIB。 用下面的宏定义函数就可以了。两个结构体一个放了波波器的值一个放滤波参数。用之前记得两个结构体都初始化一下。 然后滤波器参数用MATLAB的fdatool生成一下就可以了。楼主可以试试看。   详情 回复 发表于 2015-12-22 16:54
 
点赞 关注

回复
举报

1193

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
木有参考代码,感觉你这是软件滤波的范畴,话说你都已经300k了,还在乎那点50Hz的干扰么?

点评

其实我要对ADC采下来的点作平均,得到直流偏置的大小,相当于得到0频率处的值,不知道50Hz的干扰会不会有影响。  详情 回复 发表于 2015-12-22 20:21
 
 

回复

215

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
  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生成一下就可以了。楼主可以试试看。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(中级)

4
 
qiushenghua 发表于 2015-12-22 16:43
木有参考代码,感觉你这是软件滤波的范畴,话说你都已经300k了,还在乎那点50Hz的干扰么?

其实我要对ADC采下来的点作平均,得到直流偏置的大小,相当于得到0频率处的值,不知道50Hz的干扰会不会有影响。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

猜你喜欢
随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
Microchip 直播|利用motorBench开发套件高效开发电机磁场定向控制方案 报名中!
直播主题:利用motorBench开发套件高效开发电机磁场定向控制方案
直播时间:2025年3月25日(星期二)上午10:30-11:30
快来报名!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表