2349|1

2057

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

[TI首届低功耗设计大赛]+扩展板1+74hc595数码管电位器扩展板+P4.2 A10限幅滤波处理 [复制链接]

应为最近比较慢所以在玩这个板子的时间无法保证,这个帖子本来早就需要写了,拖到现在。写这篇的意义在于对实际的应用场合有很多的电磁计芯片内部的ADC采样等一系列的干扰,为了使系统更稳健,又是需要处理掉有些偶然出现的波动和干扰。
本实验使用的是比较传统的限幅滤波算法,所谓限幅顾名思义就是把信号的变化限制在一定的幅度的范围内,高于我们设定的幅度,就当是干扰去除掉。在编写这个算法的过程中,需要判断采样的幅度的变化范围,所以也可称为程序判断滤波算法
本程序使用的是P4.2管脚的A10功能,也就是ADC的通道10,使用定时器触发采样,数据的计算放在了ADC采样中断中。

MSP430FR59x Demo -通过芯片的P4.2的A10通道采样,使用限幅滤波法采样得到的数据再驱动74HC595显示
Description:  限幅滤波法
A、方法:
    根据经验判断,确定两次采样允许的最大偏差值(设为A)
  每次检测到新值时判断:
  如果本次值与上次值之差<=A,则本次值有效
  如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值
B、优点:
 能有效克服因偶然因素引起的脉冲干扰
C、缺点
 无法抑制周期性的干扰
 平滑度差
ACLK = n/a, MCLK = SMCLK = 8MHZ



  1. /*******************************************************************************
  2. //  MSP430FR59x Demo -通过芯片的P4.2的A10通道采样,使用限幅滤波法采样得到的数据再
  3. //                    驱动74HC595显示
  4. //
  5. //  Description:  限幅滤波法(又称程序判断滤波法)
  6. // A、方法:
  7. //     根据经验判断,确定两次采样允许的最大偏差值(设为A)
  8. //   每次检测到新值时判断:
  9. //   如果本次值与上次值之差<=A,则本次值有效
  10. //   如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值
  11. // B、优点:
  12. //   能有效克服因偶然因素引起的脉冲干扰
  13. // C、缺点
  14. //   无法抑制周期性的干扰
  15. //   平滑度差
  16. //  ACLK = n/a, MCLK = SMCLK = 8MHZ
  17. //
  18. //           MSP430FR5969
  19. //         ---------------
  20. //     /|\|               |
  21. //      | |               |
  22. //      --|RST            |
  23. //   A10--|P4.2           |
  24. //        |           P2.2|
  25. // SRCLK--|P3.4       P2.4|
  26. //   SER--|P3.5       P2.5|
  27. //  RCLK--|P3.6       P4.3|
  28. //
  29. //   IC爬虫   QQ:1394024051
  30. //   
  31. //   Otc 2014
  32. //   Built with IAR Embedded Workbench V6.1
  33. *******************************************************************************/
  34. #include <msp430.h>
  35. #define uchar unsigned char
  36. #define uint unsigned int
  37. #define A 2
  38. unsigned char j = 0;
  39. long result[31],resultsum,resultend,resultq = 0,resultend1=1234;
  40. uchar ge,shi,bai,qian;
  41. long resultq1=1234;
  42. #define SER   ( 1 << 5 ) //也是所谓的DS
  43. #define SRCLK ( 1 << 4 ) //也是所谓的SHCP
  44. #define RCLK  ( 1 << 6 ) //也是所谓的STCP
  45. /*******************************************************************************
  46. *函数名 :delay_1ms
  47. *描述   :延时函数
  48. *输入   :无
  49. *输出   :无
  50. *调用   :内部调用
  51. ******************************************************************************/
  52. void delay_1ms(void)
  53. {
  54.   unsigned int i;
  55.   for (i=0;i<1000;i++);
  56. }
  57. /*******************************************************************************
  58. *函数名 :delay_nms
  59. *描述   :延时函数
  60. *输入   :n -- 延时n个ms
  61. *输出   :无
  62. *调用   :内部调用
  63. ******************************************************************************/
  64. void delay_nms(unsigned int n)
  65. {
  66.   unsigned int i=0;
  67.   for (i=0;i<n;i++)
  68.   delay_1ms();
  69. }
  70. unsigned char table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };
  71. /*******************************************************************************
  72. *函数名 :Write595
  73. *描述   :74HC595写入数字函数
  74. *输入   :无
  75. *输出   :无
  76. *调用   :内部调用
  77. ******************************************************************************/
  78. void Write595(unsigned char data)
  79. {
  80.   unsigned char i;
  81.   P3OUT &= ~RCLK;
  82.   for( i=0;i<8;i++ )
  83.   {
  84.     if(data&0x80)
  85.     {
  86.       P3OUT |= SER;
  87.     }
  88.     else
  89.     {
  90.       P3OUT &= ~SER;
  91.     }
  92.     P3OUT &= ~SRCLK;
  93.     P3OUT |= SRCLK;
  94.     data <<= 1;
  95.   }
  96.   P3OUT |= RCLK;
  97. }
  98. /*******************************************************************************
  99. *函数名 :ADC_init
  100. *描述   :ADC初始化函数,配置P4.2管脚的功能为ADC的输入通道10(A10),参考电压为芯片
  101. *         的电源电压,使用定时器触发ADC采样,精度配置为12位。
  102. *输入   :无
  103. *输出   :无
  104. *调用   :内部调用
  105. ******************************************************************************/
  106. void ADC_init(void)
  107. {
  108.   // Configure ADC12
  109.   ADC12CTL0  = ADC12SHT0_0 | ADC12ON;        // Sampling time, S&H=16, ADC12 on
  110.   ADC12CTL1  = ADC12SHP | ADC12SHS_1 | ADC12CONSEQ_2;  // Use sampling timer
  111.   ADC12CTL2 |= ADC12RES_2;                   // 12-bit conversion results
  112.   ADC12MCTL0|= ADC12INCH_10 ;                // 选择通道10也就是A10,参考电压AVCC
  113.   ADC12IER0 |= ADC12IE0;                     // 使能ADC转换完成中断,对应着ADC中断函数中case
  114.                                              // 语句的ADC12IFG0
  115.   ADC12CTL0 |= ADC12ENC | ADC12SC;
  116.   // Configure Timer0_A3 to periodically trigger the ADC12
  117.   TA0CCR0 = 2300;                            // PWM Period
  118.   TA0CCTL1 = OUTMOD_3;                       // TACCR1 set/reset
  119.   TA0CCR1 = 2;                               // TACCR1 PWM Duty Cycle
  120.   TA0CTL = TASSEL__ACLK | MC__UP;            // ACLK, up mode
  121.   
  122. }

  123. void main(void)
  124. {
  125.   WDTCTL = WDTPW + WDTHOLD;    // Stop WDT
  126.   
  127.   P4DIR  &=~ BIT2;
  128.   P4SEL1 |= BIT2;              // Configure ADC P4.2/A10
  129.   P4SEL0 |= BIT2;      
  130.   
  131.   P2DIR |= (BIT2|BIT4|BIT5);   // P2.2,P2.4,P2.5设置为输出端口
  132.   P4DIR |= BIT3;               // P4.3设置为输出端口

  133.   P3DIR |= (BIT4|BIT5|BIT6);   // P3.4,P3.5,P3.6设置为输出端口
  134.   
  135.   PJSEL0 |= BIT4 | BIT5;       // For XT1
  136.   
  137.   PM5CTL0 &= ~LOCKLPM5;        // 关闭上电端口默认输出高阻抗的功能,使能上电保持起始设置
  138.   /*****************************************************************************/
  139.   // Clock System Setup
  140.   CSCTL0_H = CSKEY >> 8;                    // Unlock CS registers
  141.   CSCTL1 = DCOFSEL_4 ;                      // Set DCO to 8MHz
  142.   CSCTL2 = SELA__LFXTCLK | SELS__DCOCLK | SELM__DCOCLK;
  143.   CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;     // MCLK = SMCLK = 1MHz
  144.   CSCTL4 &= ~LFXTOFF;                       // Enable LFXT1
  145.     do
  146.   {
  147.     CSCTL5 &= ~LFXTOFFG;                    // Clear XT1 fault flag
  148.     SFRIFG1 &= ~OFIFG;
  149.   }while (SFRIFG1&OFIFG);                  // Test oscillator fault flag
  150.   CSCTL0_H = 0;                             // Lock CS registers
  151.   /*****************************************************************************/
  152.   
  153.   ADC_init();
  154.   _EINT();
  155.   while(1)
  156.   {
  157.    
  158.     resultend = resultq*3621/4096;
  159.     qian = resultend /1000;
  160.     bai  = resultend /100%10;
  161.     shi  = resultend /10%10;
  162.     ge   = resultend %10;
  163.    
  164.     P2OUT |= (( 1 << 2 )|(1<<4)|(1<<5));
  165.     P4OUT |= (1<<3);
  166.     Write595(table[ge]);
  167.     P2OUT &= ~( 1 << 5 );
  168.     delay_nms(1);

  169.     P2OUT |= (( 1 << 2 )|(1<<4)|(1<<5));
  170.     P4OUT |= (1<<3);
  171.     Write595(table[shi]);
  172.     P4OUT &= ~( 1 << 3 );
  173.     delay_nms(1);

  174.     P2OUT |= (( 1 << 2 )|(1<<4)|(1<<5));
  175.     P4OUT |= (1<<3);
  176.     Write595(table[bai]);
  177.     P2OUT &= ~( 1 << 4 );
  178.     delay_nms(1);

  179.     P2OUT |= (( 1 << 2 )|(1<<4)|(1<<5));
  180.     P4OUT |= (1<<3);
  181.     Write595(table[qian]);
  182.     P2OUT &= ~( 1 << 2 );
  183.     delay_nms(1);
  184.   }
  185. }
  186. /********************************************************************/
  187. #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
  188. #pragma vector = ADC12_VECTOR
  189. __interrupt void ADC12_ISR(void)
  190. #elif defined(__GNUC__)
  191. void __attribute__ ((interrupt(ADC12_VECTOR))) ADC12_ISR (void)
  192. #else
  193. #error Compiler not supported!
  194. #endif
  195. {
  196.   switch(__even_in_range(ADC12IV, ADC12IV_ADC12RDYIFG))
  197.   {
  198.     case ADC12IV_NONE:        break;        // Vector  0:  No interrupt
  199.     case ADC12IV_ADC12OVIFG:  break;        // Vector  2:  ADC12MEMx Overflow
  200.     case ADC12IV_ADC12TOVIFG: break;        // Vector  4:  Conversion time overflow
  201.     case ADC12IV_ADC12HIIFG:  break;        // Vector  6:  ADC12BHI
  202.     case ADC12IV_ADC12LOIFG:  break;        // Vector  8:  ADC12BLO
  203.     case ADC12IV_ADC12INIFG:  break;        // Vector 10:  ADC12BIN
  204.     case ADC12IV_ADC12IFG0:                 // Vector 12:  ADC12MEM0 Interrupt
  205.          //resultq = ADC12MEM0;
  206.       if(j<31)
  207.          {
  208.             result[j] = ADC12MEM0;
  209.             if(j>=2)
  210.             {
  211.                if((result[j] - result[j-1]>A)||(result[j-1] - result[j]>A))
  212.                resultsum += result[j-1];
  213.                else
  214.                resultsum += result[j];
  215.              }
  216.       
  217.              j++;
  218.          }
  219.          else
  220.         {
  221.            resultq = resultsum/29;
  222.            resultsum =0;
  223.            j = 0;
  224.         }
  225.       break;                                // Clear CPUOFF bit from 0(SR)
  226.     case ADC12IV_ADC12IFG1:   break;        // Vector 14:  ADC12MEM1
  227.     case ADC12IV_ADC12IFG2:   break;        // Vector 16:  ADC12MEM2
  228.     case ADC12IV_ADC12IFG3:   break;        // Vector 18:  ADC12MEM3
  229.     case ADC12IV_ADC12IFG4:   break;        // Vector 20:  ADC12MEM4
  230.     case ADC12IV_ADC12IFG5:   break;        // Vector 22:  ADC12MEM5
  231.     case ADC12IV_ADC12IFG6:   break;        // Vector 24:  ADC12MEM6
  232.     case ADC12IV_ADC12IFG7:   break;        // Vector 26:  ADC12MEM7
  233.     case ADC12IV_ADC12IFG8:   break;        // Vector 28:  ADC12MEM8
  234.     case ADC12IV_ADC12IFG9:   break;        // Vector 30:  ADC12MEM9
  235.     case ADC12IV_ADC12IFG10:  break;        // Vector 32:  ADC12MEM10
  236.     case ADC12IV_ADC12IFG11:  break;        // Vector 34:  ADC12MEM11
  237.     case ADC12IV_ADC12IFG12:  break;        // Vector 36:  ADC12MEM12
  238.     case ADC12IV_ADC12IFG13:  break;        // Vector 38:  ADC12MEM13
  239.     case ADC12IV_ADC12IFG14:  break;        // Vector 40:  ADC12MEM14
  240.     case ADC12IV_ADC12IFG15:  break;        // Vector 42:  ADC12MEM15
  241.     case ADC12IV_ADC12IFG16:  break;        // Vector 44:  ADC12MEM16
  242.     case ADC12IV_ADC12IFG17:  break;        // Vector 46:  ADC12MEM17
  243.     case ADC12IV_ADC12IFG18:  break;        // Vector 48:  ADC12MEM18
  244.     case ADC12IV_ADC12IFG19:  break;        // Vector 50:  ADC12MEM19
  245.     case ADC12IV_ADC12IFG20:  break;        // Vector 52:  ADC12MEM20
  246.     case ADC12IV_ADC12IFG21:  break;        // Vector 54:  ADC12MEM21
  247.     case ADC12IV_ADC12IFG22:  break;        // Vector 56:  ADC12MEM22
  248.     case ADC12IV_ADC12IFG23:  break;        // Vector 58:  ADC12MEM23
  249.     case ADC12IV_ADC12IFG24:  break;        // Vector 60:  ADC12MEM24
  250.     case ADC12IV_ADC12IFG25:  break;        // Vector 62:  ADC12MEM25
  251.     case ADC12IV_ADC12IFG26:  break;        // Vector 64:  ADC12MEM26
  252.     case ADC12IV_ADC12IFG27:  break;        // Vector 66:  ADC12MEM27
  253.     case ADC12IV_ADC12IFG28:  break;        // Vector 68:  ADC12MEM28
  254.     case ADC12IV_ADC12IFG29:  break;        // Vector 70:  ADC12MEM29
  255.     case ADC12IV_ADC12IFG30:  break;        // Vector 72:  ADC12MEM30
  256.     case ADC12IV_ADC12IFG31:  break;        // Vector 74:  ADC12MEM31
  257.     case ADC12IV_ADC12RDYIFG: break;        // Vector 76:  ADC12RDY
  258.     default: break;
  259.   }
  260. }
复制代码



最新回复

好详细,楼主给力  详情 回复 发表于 2014-10-22 15:40
 
点赞 关注

回复
举报
jyb2014 该用户已被删除
沙发
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
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
快速回复 返回顶部 返回列表