|
[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
- /*******************************************************************************
- // MSP430FR59x Demo -通过芯片的P4.2的A10通道采样,使用限幅滤波法采样得到的数据再
- // 驱动74HC595显示
- //
- // Description: 限幅滤波法(又称程序判断滤波法)
- // A、方法:
- // 根据经验判断,确定两次采样允许的最大偏差值(设为A)
- // 每次检测到新值时判断:
- // 如果本次值与上次值之差<=A,则本次值有效
- // 如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值
- // B、优点:
- // 能有效克服因偶然因素引起的脉冲干扰
- // C、缺点
- // 无法抑制周期性的干扰
- // 平滑度差
- // ACLK = n/a, MCLK = SMCLK = 8MHZ
- //
- // MSP430FR5969
- // ---------------
- // /|\| |
- // | | |
- // --|RST |
- // A10--|P4.2 |
- // | P2.2|
- // SRCLK--|P3.4 P2.4|
- // SER--|P3.5 P2.5|
- // RCLK--|P3.6 P4.3|
- //
- // IC爬虫 QQ:1394024051
- //
- // Otc 2014
- // Built with IAR Embedded Workbench V6.1
- *******************************************************************************/
- #include <msp430.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define A 2
- unsigned char j = 0;
- long result[31],resultsum,resultend,resultq = 0,resultend1=1234;
- uchar ge,shi,bai,qian;
- long resultq1=1234;
- #define SER ( 1 << 5 ) //也是所谓的DS
- #define SRCLK ( 1 << 4 ) //也是所谓的SHCP
- #define RCLK ( 1 << 6 ) //也是所谓的STCP
- /*******************************************************************************
- *函数名 :delay_1ms
- *描述 :延时函数
- *输入 :无
- *输出 :无
- *调用 :内部调用
- ******************************************************************************/
- void delay_1ms(void)
- {
- unsigned int i;
- for (i=0;i<1000;i++);
- }
- /*******************************************************************************
- *函数名 :delay_nms
- *描述 :延时函数
- *输入 :n -- 延时n个ms
- *输出 :无
- *调用 :内部调用
- ******************************************************************************/
- void delay_nms(unsigned int n)
- {
- unsigned int i=0;
- for (i=0;i<n;i++)
- delay_1ms();
- }
- unsigned char table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };
- /*******************************************************************************
- *函数名 :Write595
- *描述 :74HC595写入数字函数
- *输入 :无
- *输出 :无
- *调用 :内部调用
- ******************************************************************************/
- void Write595(unsigned char data)
- {
- unsigned char i;
- P3OUT &= ~RCLK;
- for( i=0;i<8;i++ )
- {
- if(data&0x80)
- {
- P3OUT |= SER;
- }
- else
- {
- P3OUT &= ~SER;
- }
- P3OUT &= ~SRCLK;
- P3OUT |= SRCLK;
- data <<= 1;
- }
- P3OUT |= RCLK;
- }
- /*******************************************************************************
- *函数名 :ADC_init
- *描述 :ADC初始化函数,配置P4.2管脚的功能为ADC的输入通道10(A10),参考电压为芯片
- * 的电源电压,使用定时器触发ADC采样,精度配置为12位。
- *输入 :无
- *输出 :无
- *调用 :内部调用
- ******************************************************************************/
- void ADC_init(void)
- {
- // Configure ADC12
- ADC12CTL0 = ADC12SHT0_0 | ADC12ON; // Sampling time, S&H=16, ADC12 on
- ADC12CTL1 = ADC12SHP | ADC12SHS_1 | ADC12CONSEQ_2; // Use sampling timer
- ADC12CTL2 |= ADC12RES_2; // 12-bit conversion results
- ADC12MCTL0|= ADC12INCH_10 ; // 选择通道10也就是A10,参考电压AVCC
- ADC12IER0 |= ADC12IE0; // 使能ADC转换完成中断,对应着ADC中断函数中case
- // 语句的ADC12IFG0
- ADC12CTL0 |= ADC12ENC | ADC12SC;
- // Configure Timer0_A3 to periodically trigger the ADC12
- TA0CCR0 = 2300; // PWM Period
- TA0CCTL1 = OUTMOD_3; // TACCR1 set/reset
- TA0CCR1 = 2; // TACCR1 PWM Duty Cycle
- TA0CTL = TASSEL__ACLK | MC__UP; // ACLK, up mode
-
- }
- void main(void)
- {
- WDTCTL = WDTPW + WDTHOLD; // Stop WDT
-
- P4DIR &=~ BIT2;
- P4SEL1 |= BIT2; // Configure ADC P4.2/A10
- P4SEL0 |= BIT2;
-
- P2DIR |= (BIT2|BIT4|BIT5); // P2.2,P2.4,P2.5设置为输出端口
- P4DIR |= BIT3; // P4.3设置为输出端口
-
- P3DIR |= (BIT4|BIT5|BIT6); // P3.4,P3.5,P3.6设置为输出端口
-
- PJSEL0 |= BIT4 | BIT5; // For XT1
-
- PM5CTL0 &= ~LOCKLPM5; // 关闭上电端口默认输出高阻抗的功能,使能上电保持起始设置
- /*****************************************************************************/
- // Clock System Setup
- CSCTL0_H = CSKEY >> 8; // Unlock CS registers
- CSCTL1 = DCOFSEL_4 ; // Set DCO to 8MHz
- CSCTL2 = SELA__LFXTCLK | SELS__DCOCLK | SELM__DCOCLK;
- CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1; // MCLK = SMCLK = 1MHz
- CSCTL4 &= ~LFXTOFF; // Enable LFXT1
- do
- {
- CSCTL5 &= ~LFXTOFFG; // Clear XT1 fault flag
- SFRIFG1 &= ~OFIFG;
- }while (SFRIFG1&OFIFG); // Test oscillator fault flag
- CSCTL0_H = 0; // Lock CS registers
- /*****************************************************************************/
-
- ADC_init();
- _EINT();
- while(1)
- {
-
- resultend = resultq*3621/4096;
- qian = resultend /1000;
- bai = resultend /100%10;
- shi = resultend /10%10;
- ge = resultend %10;
-
- P2OUT |= (( 1 << 2 )|(1<<4)|(1<<5));
- P4OUT |= (1<<3);
- Write595(table[ge]);
- P2OUT &= ~( 1 << 5 );
- delay_nms(1);
- P2OUT |= (( 1 << 2 )|(1<<4)|(1<<5));
- P4OUT |= (1<<3);
- Write595(table[shi]);
- P4OUT &= ~( 1 << 3 );
- delay_nms(1);
- P2OUT |= (( 1 << 2 )|(1<<4)|(1<<5));
- P4OUT |= (1<<3);
- Write595(table[bai]);
- P2OUT &= ~( 1 << 4 );
- delay_nms(1);
- P2OUT |= (( 1 << 2 )|(1<<4)|(1<<5));
- P4OUT |= (1<<3);
- Write595(table[qian]);
- P2OUT &= ~( 1 << 2 );
- delay_nms(1);
- }
- }
- /********************************************************************/
- #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
- #pragma vector = ADC12_VECTOR
- __interrupt void ADC12_ISR(void)
- #elif defined(__GNUC__)
- void __attribute__ ((interrupt(ADC12_VECTOR))) ADC12_ISR (void)
- #else
- #error Compiler not supported!
- #endif
- {
- switch(__even_in_range(ADC12IV, ADC12IV_ADC12RDYIFG))
- {
- case ADC12IV_NONE: break; // Vector 0: No interrupt
- case ADC12IV_ADC12OVIFG: break; // Vector 2: ADC12MEMx Overflow
- case ADC12IV_ADC12TOVIFG: break; // Vector 4: Conversion time overflow
- case ADC12IV_ADC12HIIFG: break; // Vector 6: ADC12BHI
- case ADC12IV_ADC12LOIFG: break; // Vector 8: ADC12BLO
- case ADC12IV_ADC12INIFG: break; // Vector 10: ADC12BIN
- case ADC12IV_ADC12IFG0: // Vector 12: ADC12MEM0 Interrupt
- //resultq = ADC12MEM0;
- if(j<31)
- {
- result[j] = ADC12MEM0;
- if(j>=2)
- {
- if((result[j] - result[j-1]>A)||(result[j-1] - result[j]>A))
- resultsum += result[j-1];
- else
- resultsum += result[j];
- }
-
- j++;
- }
- else
- {
- resultq = resultsum/29;
- resultsum =0;
- j = 0;
- }
- break; // Clear CPUOFF bit from 0(SR)
- case ADC12IV_ADC12IFG1: break; // Vector 14: ADC12MEM1
- case ADC12IV_ADC12IFG2: break; // Vector 16: ADC12MEM2
- case ADC12IV_ADC12IFG3: break; // Vector 18: ADC12MEM3
- case ADC12IV_ADC12IFG4: break; // Vector 20: ADC12MEM4
- case ADC12IV_ADC12IFG5: break; // Vector 22: ADC12MEM5
- case ADC12IV_ADC12IFG6: break; // Vector 24: ADC12MEM6
- case ADC12IV_ADC12IFG7: break; // Vector 26: ADC12MEM7
- case ADC12IV_ADC12IFG8: break; // Vector 28: ADC12MEM8
- case ADC12IV_ADC12IFG9: break; // Vector 30: ADC12MEM9
- case ADC12IV_ADC12IFG10: break; // Vector 32: ADC12MEM10
- case ADC12IV_ADC12IFG11: break; // Vector 34: ADC12MEM11
- case ADC12IV_ADC12IFG12: break; // Vector 36: ADC12MEM12
- case ADC12IV_ADC12IFG13: break; // Vector 38: ADC12MEM13
- case ADC12IV_ADC12IFG14: break; // Vector 40: ADC12MEM14
- case ADC12IV_ADC12IFG15: break; // Vector 42: ADC12MEM15
- case ADC12IV_ADC12IFG16: break; // Vector 44: ADC12MEM16
- case ADC12IV_ADC12IFG17: break; // Vector 46: ADC12MEM17
- case ADC12IV_ADC12IFG18: break; // Vector 48: ADC12MEM18
- case ADC12IV_ADC12IFG19: break; // Vector 50: ADC12MEM19
- case ADC12IV_ADC12IFG20: break; // Vector 52: ADC12MEM20
- case ADC12IV_ADC12IFG21: break; // Vector 54: ADC12MEM21
- case ADC12IV_ADC12IFG22: break; // Vector 56: ADC12MEM22
- case ADC12IV_ADC12IFG23: break; // Vector 58: ADC12MEM23
- case ADC12IV_ADC12IFG24: break; // Vector 60: ADC12MEM24
- case ADC12IV_ADC12IFG25: break; // Vector 62: ADC12MEM25
- case ADC12IV_ADC12IFG26: break; // Vector 64: ADC12MEM26
- case ADC12IV_ADC12IFG27: break; // Vector 66: ADC12MEM27
- case ADC12IV_ADC12IFG28: break; // Vector 68: ADC12MEM28
- case ADC12IV_ADC12IFG29: break; // Vector 70: ADC12MEM29
- case ADC12IV_ADC12IFG30: break; // Vector 72: ADC12MEM30
- case ADC12IV_ADC12IFG31: break; // Vector 74: ADC12MEM31
- case ADC12IV_ADC12RDYIFG: break; // Vector 76: ADC12RDY
- default: break;
- }
- }
复制代码
|
|