精华内容
下载资源
问答
  • 本文主要介绍10种AD采样的软件滤波方法及例程,感兴趣的朋友可以看看。
  • 基于FPGA的高速AD采样设计 基于FPGA的高速AD采样设计 基于FPGA的高速AD采样设计 基于FPGA的高速AD采样设计
  • 这是一款24位AD采样芯片的电路图,帮你设计电路进行优化,让你在设计重少走弯路,谢谢采纳
  • 基于51单片机,用于内部AD采样,并用LCD1602显示采样电压值
  • stm32f030内部AD采样电压程序 ,支持9路通道同时采样。在产品上已使用。
  • 基于verilog的ad采样

    2017-07-11 09:59:17
    通过fpga对ad采样的5路信号进行处理
  • 按键AD采样实时显示

    2015-08-02 15:33:39
    MSP430单片机AD实时采样并通过按键控制输出显示
  • ad采样注意事项

    2018-03-15 15:17:42
    ad采样注意事项,看了之后相信你对AD采样一定会有不一样理解
  • 基于FPGA的AD采样设计.pdf
  • 51单片机ad采样

    2013-12-11 17:07:45
    51单片机ad采样,通过外置芯片进行采样
  • 描述ad采样的步骤:首先将外部的信号,通过电路或者已有的AD芯片转换成 主CPU能接受的电压 信号。但是此电压信号必须转换成8、10 、12位或更高位数的数字才能进一步做计算。另外转换成位数多少表明了ad转换的精度。...

    描述

    ad采样的步骤:首先将外部的信号,通过电路或者已有的AD芯片转换成 主CPU能接受的电压 信号。但是此电压信号必须转换成8、10 、12位或更高位数的数字才能进一步做计算。另外转换成位数多少表明了ad转换的精度。所以需要采样,为了将电压信号转换为8、10 、12位或更高位数的数字。

    单片机AD采样工作原理

    一般来说,AD有积分型的和逐次逼近型的,后都更多的被使用,所以我们一般也都是使用的这一种。说的简单点,它就像我们用天平来称东西一样;AD收到一个电压信号,先将AD内部的一个寄存器里的最高位置1,然后再把这个数据转换成电压信号与输入的比较,如果大了,那么把最高位清0,次高位置位,就这样比较;如果小了,次高位再置位,再次比较。和称东西的一样吧,你一边放上东西,另一边先放最大的砝码,如果大了再换小的,如果不够,再加次大的,这样比较进行的。

    545997c244e38a383f4ed40d33d44fc9.png

    STC12C5A60S2单片机AD采样程序

    /*********************************************************************************************************************************************************

    *程序说明:本程序使用STC12C5A60S2 ADC转换功能,ADC采样使用查询方式

    *芯片供电:5V

    *采样通道:P1^0

    *********************************************************************************************************************************************************/

    #include “STC12C5A60S2.h”

    #include “stdio.h”

    #include “intrins.h”

    #include “math.h”

    #define uint unsigned int

    #define uchar unsigned char

    /*******************************************************************************************************************************************************************

    *函数功能:获取ADC采样值

    *时间:2013、3、27

    *相关寄存器讲解: 7 6 5 4 3 2 1 0 Reset Vale

    *:ADC_CONTR://A/D 转换控制寄存器 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000

    * ADC_RES //A/D 转换结果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2 0000,0000

    *ADC_RESL //A/D 转换结果低2位 ADCV.1 ADCV.0 0000,0000

    *寄存器位控制讲解:

    ADC_POWER:ADC电源

    ADC_START:ADC转换启动控制位 设置为1时开始转换 转换结束后为0

    ADC_FLAG:ADC转换结束标志位 转换完成后 ADC_FLAG=1 要由软件一定要清0

    SPEED1|SPEED0:模数转换器速度控制位 CHS2/CHS1CHS0:模拟输入通道选择

    ------------------------------------------------ -------------------------------------------------

    |SPEED1 | SPEED0 | 转换时间 | | CHS2 | CHS1 | CHS0 | 模拟输入通道|

    | 1 | 1 | 90个时钟周期 | | 0 | 0 | 0 | | P1^0 |

    | 1 | 0 | 180个时钟周期 | | 0 | 0 | 1 | | P1^1 |

    | 0 | 1 | 360个时钟周期 | | 0 | 1 | 0 | | P1^2 |

    | 0 | 0 | 540个时钟周期 | | 0 | 1 | 1 | | P1^3 |

    ------------------------------------------------- | 1 | 0 | 0 | | P1^4 |

    | 1 | 0 | 1 | | P1^5 |

    | 1 | 1 | 0 | | P1^6 |

    | 1 | 1 | 1 | | P1^7 |

    ----------------------------------------------

    ************************************************************************************************************************************************************************/

    uint ADC_Get(uchar Channel)

    {

    ADC_CONTR=0x88|Channel;

    _nop_(); _nop_(); _nop_(); _nop_();

    while(!(ADC_CONTR&0x10)); //等待转换完成

    ADC_CONTR&=0xe7; //关闭AD转换,ADC_FLAG位由软件清0

    return(ADC_RES*4+ADC_RESL); //返回AD转换完成的10位数据(16进制)

    }

    /******************************************************************

    *函数功能:将ADC采样值转换为10进制数据

    *时间:2013、3、27

    ******************************************************************/

    float ADC_Value(uchar Channel)

    {

    float AD_Value;

    uint i;

    for(i=0;i《10;i++) //采样10次取平均值

    AD_Value+=ADC_Get(Channel); //转换100次求平均值(提高精度)

    AD_Value/=10;

    AD_Value=(AD_Value*5)/1024;//ADRJ=0,取10位转换结果ADC_RES+ADC_RESL=1024*Vin/Vcc

    return AD_Value;

    }

    /***************************************************************

    *Funtion Name:delay

    *Time:2013/3/27

    Author:zhuhao

    ***************************************************************/

    void delay(unsigned int a) //延时约1ms

    {

    unsigned int i;

    while (--a!=0)

    for(i=600;i》0;i--); //1T单片机i=600,若是12T单片机i=125

    }

    /***************************************************************

    *Funtion Name:USART_Init

    *Time:2013/3/27

    Author:zhuhao

    ***************************************************************/

    void USART_Init()

    {

    TMOD=0x20;

    TH1=0xfd;

    TL1=0xfd; //设置9600波特率

    SCON=0x50; //串口方式1,允许接收

    TR1=1;

    }

    /**********************************************************************

    *函数功能:ADC初始化配置

    *时间:2013、3、27

    *寄存器讲解: 7 6 5 4 3 2 1 0 Reset Value

    P1ASF:选择模拟功能A/D端口 P1ASF P1ASF P1ASF P1ASF P1ASF P1ASF P1ASF P1ASF 0000,0000

    P1ASF相应位置1则P1口的相应位作为模拟功能A/D使用

    7 6 5 4 3 2 1 0 Reset Value

    AUXR1: PCA_P4 SPI_P4 S2_P4 GF2 ADRJ DPS 0000,0000

    其中ADRJ位控制A/D转换结果寄存器(ADC_RES,ADC_RESL)的数据格式调整

    ADRJ=0:10位A/D转换结果的高8位存放在ADC_RES中,低2位存放在ADC_RESL的低2位中

    ADRJ=1:10位A/D转换结果的高8位存放在ADC_RESL中,低2位存放在ADC_RES的低2位中

    ***********************************************************************/

    void ADC_Init()

    {

    P1ASF=0x01;//ADC I/O选择 P1^0;

    AUXR1=0x00;//ADRJ=0

    ADC_RES=0;//10位ADC采样结果的高8位存放在ADC_RES中,低二位存放在ADC_RES_L的低二位中

    ADC_RESL=0;

    ADC_CONTR=0x80;//开启ADC电源

    delay(2);//必要的延时

    }

    void main()

    {

    USART_Init();

    ADC_Init();

    while(1)

    {

    TI=1;

    printf(“转化:%.2f V\n”,ADC_Value(0));//将ADC采样的实际电压值发送给串口助手

    TI=0;

    }

    }

    /*******************************************************************************************************************************************************************

    * STC12C5A60S2.h 文件

    ******************************************************************************************************************************************************************/

    //--------------------------------------------------------------------------------

    //新一代 1T 8051系列 单片机内核特殊功能寄存器 C51 Core SFRs

    // 7 6 5 4 3 2 1 0 Reset Value

    sfr ACC = 0xE0; //Accumulator 0000,0000

    sfr B = 0xF0; //B Register 0000,0000

    sfr PSW = 0xD0; //Program Status Word CY AC F0 RS1 RS0 OV F1 P 0000,0000

    //-----------------------------------

    sbit CY = PSW^7;

    sbit AC = PSW^6;

    sbit F0 = PSW^5;

    sbit RS1 = PSW^4;

    sbit RS0 = PSW^3;

    sbit OV = PSW^2;

    sbit P = PSW^0;

    //-----------------------------------

    sfr SP = 0x81; //Stack Pointer 0000,0111

    sfr DPL = 0x82; //Data Pointer Low Byte 0000,0000

    sfr DPH = 0x83; //Data Pointer High Byte 0000,0000

    //--------------------------------------------------------------------------------

    //新一代 1T 8051系列 单片机系统管理特殊功能寄存器

    // 7 6 5 4 3 2 1 0 Reset Value

    sfr PCON = 0x87; //Power Control SMOD SMOD0 LVDF POF GF1 GF0 PD IDL 0001,0000

    // 7 6 5 4 3 2 1 0 Reset Value

    sfr AUXR = 0x8E; //Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS 0000,0000

    //-----------------------------------

    sfr AUXR1 = 0xA2; //Auxiliary Register 1 - PCA_P4 SPI_P4 S2_P4 GF2 ADRJ - DPS 0000,0000

    /*

    PCA_P4:

    0, 缺省PCA 在P1 口

    1,PCA/PWM 从P1 口切换到P4 口: ECI 从P1.2 切换到P4.1 口,

    PCA0/PWM0 从P1.3 切换到P4.2 口

    PCA1/PWM1 从P1.4 切换到P4.3 口

    SPI_P4:

    0, 缺省SPI 在P1 口

    1,SPI 从P1 口切换到P4 口: SPICLK 从P1.7 切换到P4.3 口

    MISO 从P1.6 切换到P4.2 口

    MOSI 从P1.5 切换到P4.1 口

    SS 从P1.4 切换到P4.0 口

    S2_P4:

    0, 缺省UART2 在P1 口

    1,UART2 从P1 口切换到P4 口: TxD2 从P1.3 切换到P4.3 口

    RxD2 从P1.2 切换到P4.2 口

    GF2: 通用标志位

    ADRJ:

    0, 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器

    1,10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器

    DPS: 0, 使用缺省数据指针DPTR0

    1,使用另一个数据指针DPTR1

    */

    //-----------------------------------

    sfr WAKE_CLKO = 0x8F; //附加的 SFR WAK1_CLKO

    /*

    7 6 5 4 3 2 1 0 Reset Value

    PCAWAKEUP RXD_PIN_IE T1_PIN_IE T0_PIN_IE LVD_WAKE _ T1CLKO T0CLKO 0000,0000B

    b7 - PCAWAKEUP : PCA 中断可唤醒 powerdown。

    b6 - RXD_PIN_IE : 当 P3.0(RXD) 下降沿置位 RI 时可唤醒 powerdown(必须打开相应中断)。

    b5 - T1_PIN_IE : 当 T1 脚下降沿置位 T1 中断标志时可唤醒 powerdown(必须打开相应中断)。

    b4 - T0_PIN_IE : 当 T0 脚下降沿置位 T0 中断标志时可唤醒 powerdown(必须打开相应中断)。

    b3 - LVD_WAKE : 当 CMPIN 脚低电平置位 LVD 中断标志时可唤醒 powerdown(必须打开相应中断)。

    b2 -

    b1 - T1CLKO : 允许 T1CKO(P3.5) 脚输出 T1 溢出脉冲,Fck1 = 1/2 T1 溢出率

    b0 - T0CLKO : 允许 T0CKO(P3.4) 脚输出 T0 溢出脉冲,Fck0 = 1/2 T1 溢出率

    */

    //-----------------------------------

    sfr CLK_DIV = 0x97; //Clock Divder - - - - - CLKS2 CLKS1 CLKS0 xxxx,x000

    //-----------------------------------

    sfr BUS_SPEED = 0xA1; //Stretch register - - ALES1 ALES0 - RWS2 RWS1 RWS0 xx10,x011

    /*

    ALES1 and ALES0:

    00 : The P0 address setup time and hold time to ALE negative edge is one clock cycle

    01 : The P0 address setup time and hold time to ALE negative edge is two clock cycles.

    10 : The P0 address setup time and hold time to ALE negative edge is three clock cycles. (default)

    11 : The P0 address setup time and hold time to ALE negative edge is four clock cycles.

    RWS2,RWS1,RWS0:

    000 : The MOVX read/write pulse is 1 clock cycle.

    001 : The MOVX read/write pulse is 2 clock cycles.

    010 : The MOVX read/write pulse is 3 clock cycles.

    011 : The MOVX read/write pulse is 4 clock cycles. (default)

    100 : The MOVX read/write pulse is 5 clock cycles.

    101 : The MOVX read/write pulse is 6 clock cycles.

    110 : The MOVX read/write pulse is 7 clock cycles.

    111 : The MOVX read/write pulse is 8 clock cycles.

    */

    //--------------------------------------------------------------------------------

    //新一代 1T 8051系列 单片机中断特殊功能寄存器

    //有的中断控制、中断标志位散布在其它特殊功能寄存器中,这些位在位地址中定义

    //其中有的位无位寻址能力,请参阅 新一代 1T 8051系列 单片机中文指南

    // 7 6 5 4 3 2 1 0 Reset Value

    sfr IE = 0xA8; //中断控制寄存器 EA ELVD EADC ES ET1 EX1 ET0 EX0 0x00,0000

    //-----------------------

    sbit EA = IE^7;

    sbit ELVD = IE^6; //低压监测中断允许位

    sbit EADC = IE^5; //ADC 中断允许位

    sbit ES = IE^4;

    sbit ET1 = IE^3;

    sbit EX1 = IE^2;

    sbit ET0 = IE^1;

    sbit EX0 = IE^0;

    //-----------------------

    sfr IE2 = 0xAF; //Auxiliary Interrupt - - - - - - ESPI ES2 0000,0000B

    //-----------------------

    // 7 6 5 4 3 2 1 0 Reset Value

    sfr IP = 0xB8; //中断优先级低位 PPCA PLVD PADC PS PT1 PX1 PT0 PX0 0000,0000

    //--------

    sbit PPCA = IP^7; //PCA 模块中断优先级

    sbit PLVD = IP^6; //低压监测中断优先级

    sbit PADC = IP^5; //ADC 中断优先级

    sbit PS = IP^4;

    sbit PT1 = IP^3;

    sbit PX1 = IP^2;

    sbit PT0 = IP^1;

    sbit PX0 = IP^0;

    //-----------------------

    // 7 6 5 4 3 2 1 0 Reset Value

    sfr IPH = 0xB7; //中断优先级高位 PPCAH PLVDH PADCH PSH PT1H PX1H PT0H PX0H 0000,0000

    sfr IP2 = 0xB5; // - - - - - - PSPI PS2 xxxx,xx00

    sfr IPH2 = 0xB6; // - - - - - - PSPIH PS2H xxxx,xx00

    //-----------------------

    //新一代 1T 8051系列 单片机I/O 口特殊功能寄存器

    // 7 6 5 4 3 2 1 0 Reset Value

    sfr P0 = 0x80; //8 bitPort0 P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 1111,1111

    sfr P0M0 = 0x94; // 0000,0000

    sfr P0M1 = 0x93; // 0000,0000

    sfr P1 = 0x90; //8 bitPort1 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 1111,1111

    sfr P1M0 = 0x92; // 0000,0000

    sfr P1M1 = 0x91; // 0000,0000

    sfr P1ASF = 0x9D; //P1 analog special function

    sfr P2 = 0xA0; //8 bitPort2 P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0 1111,1111

    sfr P2M0 = 0x96; // 0000,0000

    sfr P2M1 = 0x95; // 0000,0000

    sfr P3 = 0xB0; //8 bitPort3 P3.7 P3.6 P3.5 P3.4 P3.3 P3.2 P3.1 P3.0 1111,1111

    sfr P3M0 = 0xB2; // 0000,0000

    sfr P3M1 = 0xB1; // 0000,0000

    sfr P4 = 0xC0; //8 bitPort4 P4.7 P4.6 P4.5 P4.4 P4.3 P4.2 P4.1 P4.0 1111,1111

    sfr P4M0 = 0xB4; // 0000,0000

    sfr P4M1 = 0xB3; // 0000,0000

    // 7 6 5 4 3 2 1 0 Reset Value

    sfr P4SW = 0xBB; //Port-4 switch - LVD_P4.6 ALE_P4.5 NA_P4.4 - - - - x000,xxxx

    sfr P5 = 0xC8; //8 bitPort5 - - - - P5.3 P5.2 P5.1 P5.0 xxxx,1111

    sfr P5M0 = 0xCA; // 0000,0000

    sfr P5M1 = 0xC9; // 0000,0000

    //--------------------------------------------------------------------------------

    //新一代 1T 8051系列 单片机定时器特殊功能寄存器

    // 7 6 5 4 3 2 1 0 Reset Value

    sfr TCON = 0x88; //T0/T1 Control TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 0000,0000

    //-----------------------------------

    sbit TF1 = TCON^7;

    sbit TR1 = TCON^6;

    sbit TF0 = TCON^5;

    sbit TR0 = TCON^4;

    sbit IE1 = TCON^3;

    sbit IT1 = TCON^2;

    sbit IE0 = TCON^1;

    sbit IT0 = TCON^0;

    //-----------------------------------

    sfr TMOD = 0x89; //T0/T1 Modes GATE1 C/T1 M1_1 M1_0 GATE0 C/T0 M0_1 M0_0 0000,0000

    sfr TL0 = 0x8A; //T0 Low Byte 0000,0000

    sfr TH0 = 0x8C; //T0 High Byte 0000,0000

    sfr TL1 = 0x8B; //T1 Low Byte 0000,0000

    sfr TH1 = 0x8D; //T1 High Byte 0000,0000

    //--------------------------------------------------------------------------------

    //新一代 1T 8051系列 单片机串行口特殊功能寄存器

    // 7 6 5 4 3 2 1 0 Reset Value

    sfr SCON = 0x98; //Serial Control SM0/FE SM1 SM2 REN TB8 RB8 TI RI 0000,0000

    //-----------------------------------

    sbit SM0 = SCON^7; //SM0/FE

    sbit SM1 = SCON^6;

    sbit SM2 = SCON^5;

    sbit REN = SCON^4;

    sbit TB8 = SCON^3;

    sbit RB8 = SCON^2;

    sbit TI = SCON^1;

    sbit RI = SCON^0;

    //-----------------------------------

    sfr SBUF = 0x99; //Serial Data Buffer xxxx,xxxx

    sfr SADEN = 0xB9; //Slave Address Mask 0000,0000

    sfr SADDR = 0xA9; //Slave Address 0000,0000

    //-----------------------------------

    // 7 6 5 4 3 2 1 0 Reset Value

    sfr S2CON = 0x9A; //S2 Control S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI 00000000B

    sfr S2BUF = 0x9B; //S2 Serial Buffer xxxx,xxxx

    sfr BRT = 0x9C; //S2 Baud-Rate Timer 0000,0000

    //--------------------------------------------------------------------------------

    //新一代 1T 8051系列 单片机看门狗定时器特殊功能寄存器

    sfr WDT_CONTR = 0xC1; //Watch-Dog-Timer Control register

    // 7 6 5 4 3 2 1 0 Reset Value

    // WDT_FLAG - EN_WDT CLR_WDT IDLE_WDT PS2 PS1 PS0 xx00,0000

    //-----------------------

    //--------------------------------------------------------------------------------

    //新一代 1T 8051系列 单片机PCA/PWM 特殊功能寄存器

    // 7 6 5 4 3 2 1 0 Reset Value

    sfr CCON = 0xD8; //PCA 控制寄存器。 CF CR - - - - CCF1 CCF0 00xx,xx00

    //-----------------------

    sbit CF = CCON^7; //PCA计数器溢出标志,由硬件或软件置位,必须由软件清0。

    sbit CR = CCON^6; //1:允许 PCA 计数器计数, 必须由软件清0。

    //-

    //-

    sbit CCF1 = CCON^1; //PCA 模块1 中断标志, 由硬件置位, 必须由软件清0。

    sbit CCF0 = CCON^0; //PCA 模块0 中断标志, 由硬件置位, 必须由软件清0。

    //-----------------------

    sfr CMOD = 0xD9; //PCA 工作模式寄存器。 CIDL - - - CPS2 CPS1 CPS0 ECF 0xxx,x000

    /*

    CIDL: idle 状态时 PCA 计数器是否继续计数, 0: 继续计数, 1: 停止计数。

    CPS2: PCA 计数器脉冲源选择位 2。

    CPS1: PCA 计数器脉冲源选择位 1。

    CPS0: PCA 计数器脉冲源选择位 0。

    CPS2 CPS1 CPS0

    0 0 0 系统时钟频率 fosc/12。

    0 0 1 系统时钟频率 fosc/2。

    0 1 0 Timer0 溢出。

    0 1 1 由 ECI/P3.4 脚输入的外部时钟,最大 fosc/2。

    1 0 0 系统时钟频率, Fosc/1

    1 0 1 系统时钟频率/4,Fosc/4

    1 1 0 系统时钟频率/6,Fosc/6

    1 1 1 系统时钟频率/8,Fosc/8

    ECF: PCA计数器溢出中断允许位, 1--允许 CF(CCON.7) 产生中断。

    */

    //-----------------------

    sfr CL = 0xE9; //PCA 计数器低位 0000,0000

    sfr CH = 0xF9; //PCA 计数器高位 0000,0000

    //-----------------------

    // 7 6 5 4 3 2 1 0 Reset Value

    sfr CCAPM0 = 0xDA; //PCA 模块0 PWM 寄存器 - ECOM0 CAPP0 CAPN0 MAT0 TOG0 PWM0 ECCF0 x000,0000

    sfr CCAPM1 = 0xDB; //PCA 模块1 PWM 寄存器 - ECOM1 CAPP1 CAPN1 MAT1 TOG1 PWM1 ECCF1 x000,0000

    //ECOMn = 1:允许比较功能。

    //CAPPn = 1:允许上升沿触发捕捉功能。

    //CAPNn = 1:允许下降沿触发捕捉功能。

    //MATn = 1:当匹配情况发生时, 允许 CCON 中的 CCFn 置位。

    //TOGn = 1:当匹配情况发生时, CEXn 将翻转。

    //PWMn = 1:将 CEXn 设置为 PWM 输出。

    //ECCFn = 1:允许 CCON 中的 CCFn 触发中断。

    //ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn

    // 0 0 0 0 0 0 0 0x00 未启用任何功能。

    // x 1 0 0 0 0 x 0x21 16位CEXn上升沿触发捕捉功能。

    // x 0 1 0 0 0 x 0x11 16位CEXn下降沿触发捕捉功能。

    // x 1 1 0 0 0 x 0x31 16位CEXn边沿(上、下沿)触发捕捉功能。

    // 1 0 0 1 0 0 x 0x49 16位软件定时器。

    // 1 0 0 1 1 0 x 0x4d 16位高速脉冲输出。

    // 1 0 0 0 0 1 0 0x42 8位 PWM。

    //ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn

    // 0 0 0 0 0 0 0 0x00 无此操作

    // 1 0 0 0 0 1 0 0x42 普通8位PWM, 无中断

    // 1 1 0 0 0 1 1 0x63 PWM输出由低变高可产生中断

    // 1 0 1 0 0 1 1 0x53 PWM输出由高变低可产生中断

    // 1 1 1 0 0 1 1 0x73 PWM输出由低变高或由高变低都可产生中断

    //-----------------------

    sfr CCAP0L = 0xEA; //PCA 模块 0 的捕捉/比较寄存器低 8 位。 0000,0000

    sfr CCAP0H = 0xFA; //PCA 模块 0 的捕捉/比较寄存器高 8 位。 0000,0000

    sfr CCAP1L = 0xEB; //PCA 模块 1 的捕捉/比较寄存器低 8 位。 0000,0000

    sfr CCAP1H = 0xFB; //PCA 模块 1 的捕捉/比较寄存器高 8 位。 0000,0000

    //-----------------------

    // 7 6 5 4 3 2 1 0 Reset Value

    sfr PCA_PWM0 = 0xF2; //PCA 模块0 PWM 寄存器。 - - - - - - EPC0H EPC0L xxxx,xx00

    sfr PCA_PWM1 = 0xF3; //PCA 模块1 PWM 寄存器。 - - - - - - EPC1H EPC1L xxxx,xx00

    //PCA_PWMn: 7 6 5 4 3 2 1 0

    // - - - - - - EPCnH EPCnL

    //B7-B2: 保留

    //B1(EPCnH): 在 PWM 模式下,与 CCAPnH 组成 9 位数。

    //B0(EPCnL): 在 PWM 模式下,与 CCAPnL 组成 9 位数。

    //--------------------------------------------------------------------------------

    //新一代 1T 8051系列 单片机 ADC 特殊功能寄存器

    // 7 6 5 4 3 2 1 0 Reset Value

    sfr ADC_CONTR = 0xBC; //A/D 转换控制寄存器 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000

    sfr ADC_RES = 0xBD; //A/D 转换结果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2 0000,0000

    sfr ADC_RESL = 0xBE; //A/D 转换结果低2位 ADCV.1 ADCV.0 0000,0000

    //--------------------------------------------------------------------------------

    //新一代 1T 8051系列 单片机 SPI 特殊功能寄存器

    // 7 6 5 4 3 2 1 0 Reset Value

    sfr SPCTL = 0xCE; //SPI Control Register SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0 0000,0100

    sfr SPSTAT = 0xCD; //SPI Status Register SPIF WCOL - - - - - - 00xx,xxxx

    sfr SPDAT = 0xCF; //SPI Data Register 0000,0000

    //--------------------------------------------------------------------------------

    //新一代 1T 8051系列 单片机 IAP/ISP 特殊功能寄存器

    sfr IAP_DATA = 0xC2;

    sfr IAP_ADDRH = 0xC3;

    sfr IAP_ADDRL = 0xC4;

    // 7 6 5 4 3 2 1 0 Reset Value

    sfr IAP_CMD = 0xC5; //IAP Mode Table 0 - - - - - MS1 MS0 0xxx,xx00

    sfr IAP_TRIG = 0xC6;

    sfr IAP_CONTR = 0xC7; //IAP Control Register IAPEN SWBS SWRST CFAIL - WT2 WT1 WT0 0000,x000

    //--------------------------------------------------------------------------------

    打开APP阅读更多精彩内容

    点击阅读全文

    展开全文
  • 用verilog编写的基于PCF8591的AD采样程序,已经编译通过,并包含数码管显示模块(0~3.3V),以及将采集到的8位数据通过串口传输的功能
  • 基于DSP的AD采样程序

    2013-03-18 21:49:30
    基于TMS320F2812的AD采样程序代码,包括所有的头文件、源文件以及库文件。
  • stm32的多路AD切换,会引入噪声吗stm32的多路AD切换,会引入噪声首先三路AD同时采样没问题。其次,关于有效值的问题 12位都应该有效,实际使用中主要通过软件滤波和硬件滤波来减小误差,硬件滤波主要针对信号特性用...

    stm32的多路AD切换,会引入噪声吗

    stm32的多路AD切换,会引入噪声首先三路AD同时采样没问题。

    其次,关于有效值的问题 12位都应该有效,实际使用中主要通过软件滤波和硬件滤波来减小误差,硬件滤波主要针对信号特性用合适的电容滤波,还有信号线的电磁屏蔽也很重要,软件滤波的方法常见的是取平均值,还有中值法,再有就是像评委打分那样去掉N个最大值和最小值剩下的去平均数——这个算法滤波效果比较不错,缺点就是排序的效率不高,如果需要高速AD这样算肯定慢。

    有人用STM32F103做过多路AD采样吗

    一.动态范围和量程的档位:一般来说,动态范围是由AD 的位数决定的,12bit 的卡理论指标为72dB,但由于2~3bit噪声位的影响,实际能达到的动态为54~60dB。

    6dB 代表可测量的动态范围为2 倍,20dB 代表可测量动态范围为10 倍。

    60dB 的动态测量范围1000 倍,如这时的量程范围为±1000mV,则最小可测量级为±1mV。

    常见采集卡的动态范围列表如下:AD 位数理论指标(dB) 实际可达到指标(dB)24(双核) 动态范围也受卡本身本底噪声和不同量程的影响。

    举例如下,如果一块12 位卡在量程为-1000mV~1000mV 时,本底噪声为12dB,动态范围为60dB。

    经过程控放大100 倍,量程变为-10mV~10mV,本底噪声变为18dB,这时动态范围为54dB。

    在工程中,目前16 位和24 位的卡是发展的主流方向,但位数越小,对量程的选择越严格,需要的量程档位也越多。

    量程选择过小会造成过荷,过大会造成信噪比偏小。

    当前主流产品已是24 位卡。

    国际上的最高水准为24 位双核,目前国内只有东方所首创研发出此种产品。

    因传感器本身的动态范围一般不会超过160dB,因此用24 位双核的采集卡一档量程就可进行测量,在测试过程中不用考虑量程问题。

    二、最高采样频率和最低采样频率:最高采样频率一般由AD 芯片决定,在其它条件同等的情况下,最高采样频率越高,价钱越贵。

    如果采集卡每路采用独立的AD,一般来说,一道或多道同时采样时最高采样频率SF 相等。

    如果是采用单AD 芯片,分频采样的形式,每道最高采样频率为单通道的的最高采样频率2SF 除以采样通道数N,即SF/N。

    也即是说,同时采集的通道数越多,每道最高采样频率越低。

    最高采样频率满足使用要求即可,一般来说,声学信号需要40~50kHz 的最高采样率,而对绝大多数振动信号,最高采样率10kHz 就可满足使用要求。

    对土木结构的振动信号,最高采样频率到1kHz 就绰绰有余了。

    超声波或无线电信号测量,频率可能需要用到20MHz 以上,这种较高频的采集卡往往位数较低(8~12 位)。

    最低采样频率和采样档位的设定一般由软件决定,普通软件的最低采样频率由硬件最大可设的晶振数决定,但东方所的DASP 软件因有变时基(VTB)专利技术则无此限制,在此频段以下采样频率档位丰富,并可做到滑动连续显示。

    另外,需要特别提起注意的事项是,软件显示的采样频率必须和实际的采样频率完全一致,否则会引起频率测试误差。

    三、采样通道数和通道一致性:当采样通道数较多时,各通道间的一致性就是很重要的指标,各通道间的一致性包括幅值一致性和相位一致性,可通过将相同的定频或白噪声信号经过三通分别输入到两个不同的通道进行计量。

    幅值一致性可通过控制元器件的质量,对各道的满刻度幅值和直流分量进行微调来达到。

    如果两路信号采集时刻不同,就会产生相位差,造成相位不一致。

    为了避免相位不一致,有软硬两种方法。

    硬件的方法是采用每路独立的AD 和一个AD 分频采样时每路加采样保持器,两种方法都可达到相位一致,但都需要对电路进行精心的设计。

    即使每路独立的AD 方式,由于每路要用到多种电子器件,如各路元器件的一致性稍差或电路布局不合理,有时也会产生较大的相位差。

    采集卡相位是否一致关键是看所能达到的性能指标。

    采样保持器为AD 卡设计中保持幅值和相位一致的常见技术。

    那种指责利用AD 分频加采样保持为“伪并行”的说法缺乏科学根据,抛出这种说法的人主要是基础差、概念不清的缘故。

    如果分频采样时没有加采样保持器,则会产生幅值和相位误差,这种状态下可通过复杂的数字信号处理计算,用软件编程进行移相和幅值补偿,其所得结果可与硬件直接实现相当。

    四、程控滤波:带程控滤波的采集卡主要有三种方式或几种方式的组合使用。

    1.早期的仪器在采样电路中加模拟抗混滤波电路。

    这种方式单独使用时,滤波陡度必须大于80dB/OCT。

    2.目前最新采用ΔΣ的AD 芯片,采用64~256 倍“过采样”,本身具有数字选抽滤波功能,即BDFWPS 技术,以速度换精度,有较大的动态范围,滤波陡度可大于300dB/OCT。

    目前东方所INV-3018A 和INV-3018E 采集卡都采用此技术。

    3.有些所谓模数结合的滤波方法,用最高采样速率采样(约如100kHz),用DSP 处理进行数字选抽滤波,得到较低的采样频率。

    这种方法一般需要和第一种方式组合使用,否则超过最高采样频率一半的信号仍会产生无法剔除的低频混迭。

    而且在高采样率时采样档位少,滤波陡度远达不到ΔΣ的滤波效果。

    不应和ΔΣ的滤波方式混淆。

    如果采集卡不带程控滤波,如需进行频域分析,而信号中含有高于采样频率一半的的成分,则在采样前必须外接模拟抗混滤波器。

    五、幅值满刻度的精度和线性一致性:满刻度应和设计指标一致。

    线性一致性应包括不同频率时以及不同大小时的一致性,需要专用的计量仪器才可以测量。

    六、本底噪声:信号短路时的有效值和峰峰值的量级范围。

    七、支持的输入方式:除电压外,有些卡还支持电荷,IEPE(ICP)等的输入方式,高通滤波有时可选AC 和DC。

    有些卡还支持TEDS(传感器电子数据表格,即智能传感器) 八、输入阻抗:输入阻抗不...

    单片机采4HZ方波的峰峰值,AD转换速率要多少才可以呢?

    按抽样定理,抽样的速度至少是信号最高频率的2倍才行,所以你得保证必须在125ms(也就是抽样频率8Hz,1秒钟采样8次)内对信号采样一次,这是最低限度。

    这个125ms是周期,包括AD转换,还有你的数据读取等等,一般单片机自带AD,转换速率很多都是几十us,肯定够了。

    如果可以的话,采样频率高一些,效果更好。

    搭建AD域对服务器的硬件要求和软件要求,求高手指教,急急急急急...

    成为为硬件工程师首要条件不是你要学什么,而是:1.你需要一个有丰富经验的人对你进行手把手指导,从一开始就教你正确的路子,少踩坑。

    2.你需要良好的实验平台和充足的资金支持。

    有充足的资金给你折腾去开模制作PCB板,涉及到电源类的,需要烧钱买大功率器件做实验。

    射频天线类的我不懂,但是看过他们做实验的,也不是省钱的灯,平台和资金少不了。

    宽带示波器,阻抗导纳表,频谱分析仪,逻辑分析仪,能有的最好都有,平台越多越好。

    慢慢烧钱吧!剩下该怎么学,由其它大神补充,我只是强调,没有以上2个条件,按照现在的情况,你是学不成优秀的硬件工程师的。

    展开全文
  • MSP430的AD采样程序

    2013-10-03 22:23:05
    MSP430的AD采样程序,掌握了这个程序,其他相关的可以改改就能用。
  • 基于51单片机AD0809八路AD采样12864显示程序,含有相对应的原理图,通过仿真可以使用的。
  • 本程序为60s2的ad采样程序,通过采样一个通道的电压值,送至74HC595进行数码管的扫描显示
  • DSP_AD采样程序

    2011-05-15 22:05:50
    本程序主要是DSP的例程,使用DSP进行AD采样,采样外部的电流信息。
  • 10种AD采样的软件滤波方法及例程doc,10种AD采样的软件滤波方法及例程。
  • AD采样

    千次阅读 2016-05-24 10:41:05
    在集成电路例如ADC中,有许多内部失调误差源,例如,放大器输入器件之间的不匹配,采样开关关闭时采样电容上的电荷注入,或者EMI辐射的干扰等。如果这些不良失调随温度变化就会带来麻烦,因为一次校准不足以消除各种...
    

    一些定义

    sps: sample per second 

    throughput rates: 吞吐量   

    积分型:转换效果不够好,转换过程中带来的误差比较大

    逐次逼近型:转换效果较好但制作成本较高,尤其是高位数转换,转换位数越多,精度越高,制作成本就越高。

    Σ-ΔADC:以相对逐次逼近型简单的电路结构,而得到低成本,高位数及高精度的转换效果,多为16bit或24bit转换精度

    量化噪声:数模转换器(ADC)提供了许多系统中模拟信号到数字信号的重要转换。它们完成一个模拟输入信号到二元有限长度输出命令的振幅量化,范围通常在6到18b之间,是一个固有的非线性过程。该非线性特性表现为ADC二元输出中的宽带噪声,称作量化噪声,它限制了一个ADC的动态范围。

    斩波(chop): 是一项用于消除失调电压和其它低频误差的技术。对输入信号分别进行正反相处理,然后再将两个结果求平均值以后消除内部电路带来的误差电压得到没有任何失调项的差分输入电压。

    失调误差:在信号处理链路中的很多地方可能会有失调电压误差,例如,当两种不同金属连接时会产生与温度相关的热电偶电压。在集成电路例如ADC中,有许多内部失调误差源,例如,放大器输入器件之间的不匹配,采样开关关闭时采样电容上的电荷注入,或者EMI辐射的干扰等。如果这些不良失调随温度变化就会带来麻烦,因为一次校准不足以消除各种温度和电源条件下的失调误差。

     

         

    AD7321:

    类型:逐次逼近型ADC

    输出方式: 1路SPI 500ksps;

    转换精度/分辨率:12位带符号位

    通道数:2通道

    输入信号:AD7321可输入真双极性模拟信号,它有四种软件可选输入范围:±10 V、±5 V、±2.5 V和0至10 V。每个模拟输入通道支持独立编程,可设为四个输入范围之一。

    AD7321中的模拟输入可通过编程设为单端、真差分或伪差分三种模式。

    参考电压:内置一个2.5 V的参考电压,同时也可采用外部参考。如果在REFIN/OUT针脚上施加3V参考电压,AD7321则可接受±12V真双极性模拟输入。

    功耗:17mW

    电源:对于±12V输入范围,需采用最低±12V的VDD和VSS电源。

     

    AD7708/7718: (用在测温--RTD,热电偶)

    应用:是适合低频测量应用的完整模拟前端。

    类型:含PGA的24位Σ-Δ ADC

    Σ-Δ ADC原理:将模数转换过后的数字量再做一次窄带滤波处理。当模拟量进入转换器后,先在调制器中做求积处理,并将模拟量转为数字量,在这个过程中会产生一定的量化噪声,这种噪声将影响到输出结果,因此,采用将转换过的数字量以较低频率一位一位地传送到输出端,同时在这之间加一级低通滤波器的方法,就将量化噪声过滤掉,从而得到一组精确的数字量。

    转换精度/分辨率:AD7708 16bit; AD7718 24bit

    通道数:可配置为4/5个全差分输入通道或8/10个伪差分输入通道。

    输入信号:该器件上的两个引脚可配置为模拟输入或基准电压输入。AD7708是AD7718的 16位版本。利用这些ADC,可以直接转换20mV至2.56V范围的输入信号,支持传感器信号直接输入,无需进行信号调理。

    其他

    • 出厂校准
    • 单转换周期设置
    • 可编程增益前端
    • 50 Hz、60 Hz同时抑制
    • VREF Select ™ 提供绝对测量和比率测量能力

    AD7708的工作原理:同其它智能化器件一样,AD7708也可以用软件来调节其所具有的功能,即通过微控制器MCU编程向AD7708的相应寄存器填写适当的参数。AD7708芯片中共有11个寄存器,当模式寄存器(Mode Regis-ter)的最高位CHOP=0(CHOP被选中)后,其工作方框图如下图所示。

    关于AD采样


        此时,输出率可变化范围为5.35 Hz至105.03Hz,可以从中选择一个频率从而得到最佳的滤波效果。断续频率fCHOP也随之而定,为输出率(fADC)的二分之一。在MUX方框中模拟输入与fCHOP混合,并将信号送入缓冲器BUF,在缓冲器中有一级RC低通滤波,过滤掉输入信号中的噪声信号,下一级PGA的功能是可编程调整信号增益,一个经过调整合适的输入信号才被送进Σ-△调制器(MOD0)中进行求积,并转换为数字量,在Σ-△MODO中,对输入信号的采样频率为外部晶振频率32.768 kHz,在对模拟信号进行量化处理的过程中会形成量化噪声,这个噪声会影响到输出的数字量,因此必须再次对转换过的数字量进行低通数字过滤,确保输出值准确无误,这里AD7708采用了Sinc3或(sinx/x)3滤波器,它的主要作用就是消除由调制器产生的量化噪声,其中SF参数可根据所要滤掉的噪声频率大小用软件设定,默认值为69(45H),该值对50~60Hz的噪声有较好的抑制作用。

       CHOP=1时,断续(斩波)功能中止,与fCHOP相关的功能块也相应取消,此时流程图[2]如图2所示。输出频率变化范围可从16.06 Hz到1365.33 Hz,环节减少输出速度可以加快,但在输入增益或温度改变 时,可能会出现漂移,此时需要做些校验。

    关于AD采样


    关于AD采样

    计算电压值:=(读出的ADC值/65536)*2.56V.

                其中16bit的采样精度,2^16=65536。设定单输入端,输入范围0~2.56V。


    http://blog.sina.com.cn/s/blog_7ac59e5c0100qad9.html

    展开全文
  • 16位ad采样源代码,ad7606

    热门讨论 2011-10-30 15:20:07
    16位AD采样程序,基于DMA方式信息采样值。经典,芯片为ADI公司的AD7606
  • 采用软件启动的方式,适用于为了解F2812内部AD运行方式的初学者,同时为了得到更准确的采样值,采用多个通道采样同一个信号再取平均值进行滤波的方式,效果不错
  • 单片机AD采样的几种算法

    千次阅读 2019-10-31 15:46:00
    根据经验判断,确定两次采样允许的最大偏差值(设为A) 每次检测到新值时判断: 如果本次值与上次值之差<=A,则本次值有效 如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值 B、优点...

    1、限幅滤波法(又称程序判断滤波法)
        A、方法:
            根据经验判断,确定两次采样允许的最大偏差值(设为A)
            每次检测到新值时判断:
            如果本次值与上次值之差<=A,则本次值有效
            如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值
        B、优点:
            能有效克服因偶然因素引起的脉冲干扰
        C、缺点
            无法抑制那种周期性的干扰
            平滑度差
        
    2、中位值滤波法
        A、方法:
            连续采样N次(N取奇数)
            把N次采样值按大小排列
            取中间值为本次有效值
        B、优点:
            能有效克服因偶然因素引起的波动干扰
            对温度、液位的变化缓慢的被测参数有良好的滤波效果
        C、缺点:
            对流量、速度等快速变化的参数不宜

    3、算术平均滤波法
        A、方法:
            连续取N个采样值进行算术平均运算
            N值较大时:信号平滑度较高,但灵敏度较低
            N值较小时:信号平滑度较低,但灵敏度较高
            N值的选取:一般流量,N=12;压力:N=4
        B、优点:
            适用于对一般具有随机干扰的信号进行滤波
            这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动
        C、缺点:
            对于测量速度较慢或要求数据计算速度较快的实时控制不适用
            比较浪费RAM
            
    4、递推平均滤波法(又称滑动平均滤波法)
        A、方法:
            把连续取N个采样值看成一个队列
            队列的长度固定为N
            每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)
            把队列中的N个数据进行算术平均运算,就可获得新的滤波结果
            N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4
        B、优点:
            对周期性干扰有良好的抑制作用,平滑度高
            适用于高频振荡的系统    
        C、缺点:
            灵敏度低
            对偶然出现的脉冲性干扰的抑制作用较差
            不易消除由于脉冲干扰所引起的采样值偏差
            不适用于脉冲干扰比较严重的场合
            比较浪费RAM
            
    5、中位值平均滤波法(又称防脉冲干扰平均滤波法)
        A、方法:
            相当于“中位值滤波法”+“算术平均滤波法”
            连续采样N个数据,去掉一个最大值和一个最小值
            然后计算N-2个数据的算术平均值
            N值的选取:3~14
        B、优点:
            融合了两种滤波法的优点
            对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差
        C、缺点:
            测量速度较慢,和算术平均滤波法一样
            比较浪费RAM

    6、限幅平均滤波法
        A、方法:
            相当于“限幅滤波法”+“递推平均滤波法”
            每次采样到的新数据先进行限幅处理,
            再送入队列进行递推平均滤波处理
        B、优点:
            融合了两种滤波法的优点
            对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差
        C、缺点:
            比较浪费RAM

    7、一阶滞后滤波法
        A、方法:
            取a=0~1
            本次滤波结果=(1-a)*本次采样值+a*上次滤波结果
        B、优点:
            对周期性干扰具有良好的抑制作用
            适用于波动频率较高的场合
        C、缺点:
            相位滞后,灵敏度低
            滞后程度取决于a值大小
            不能消除滤波频率高于采样频率的1/2的干扰信号
            
    8、加权递推平均滤波法
        A、方法:
            是对递推平均滤波法的改进,即不同时刻的数据加以不同的权
            通常是,越接近现时刻的数据,权取得越大。
            给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低
        B、优点:
            适用于有较大纯滞后时间常数的对象
            和采样周期较短的系统
        C、缺点:
            对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号
            不能迅速反应系统当前所受干扰的严重程度,滤波效果差

    9、消抖滤波法
        A、方法:
            设置一个滤波计数器
            将每次采样值与当前有效值比较:
            如果采样值=当前有效值,则计数器清零
            如果采样值<>当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出)
                如果计数器溢出,则将本次值替换当前有效值,并清计数器
        B、优点:
            对于变化缓慢的被测参数有较好的滤波效果,
            可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动
        C、缺点:
            对于快速变化的参数不宜
            如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统

    10、限幅消抖滤波法
        A、方法:
            相当于“限幅滤波法”+“消抖滤波法”
            先限幅,后消抖
        B、优点:
            继承了“限幅”和“消抖”的优点
            改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统
        C、缺点:
            对于快速变化的参数不宜

    11、IIR 数字滤波器 
        A. 方法:
           确定信号带宽, 滤之。
           Y(n) = a1*Y(n-1) + a2*Y(n-2) + ... + ak*Y(n-k) + b0*X(n) + b1*X(n-1) + b2*X(n-2) + ... + bk*X(n-k)
       B. 优点:高通,低通,带通,带阻任意。设计简单(用matlab)
       C. 缺点:运算量大。
      


    软件滤波的C程序样例

    11种软件滤波方法的示例程序

    假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad();

    1、限副滤波
    /*  A值可根据实际情况调整
        value为有效值,new_value为当前采样值  
        滤波程序返回有效的实际值  */

    #define A 10
    char value;
    char filter()
    {
       char  new_value;
       new_value = get_ad();
       if ( ( new_value - value > A ) || ( value - new_value > A )
          return value;
       return new_value;         
    }

    2、中位值滤波法
    /*  N值可根据实际情况调整
        排序采用冒泡法*/

    #define N  11
    
    char filter()
    {
       char value_buf[N];
       char count,i,j,temp;
       for ( count=0;count<N;COUNT++)
       {
          value_buf[count] = get_ad();
          delay();
       }
       for (j=0;j<N-1;J++)
       {
          for (i=0;i<N-J;I++)
          {
             if ( value_buf>value_buf[i+1] )
             {
                temp = value_buf;
                value_buf = value_buf[i+1]; 
                 value_buf[i+1] = temp;
             }
          }
       }
       return value_buf[(N-1)/2];
    }

      3、算术平均滤波法
     

    #define N 12
    
    char filter()
    {
       int  sum = 0;
       for ( count=0;count<N;COUNT++)
       {
          sum + = get_ad();
          delay();
       }
       return (char)(sum/N);
    }

    4、递推平均滤波法(又称滑动平均滤波法)
     

    #define N 12 
    
    char value_buf[N];
    char i=0;
    
    char filter()
    {
       char count;
       int  sum=0;
       value_buf[i++] = get_ad();
       if ( i == N )   i = 0;
       for ( count=0;count<N,COUNT++)
          sum = value_buf[count];
       return (char)(sum/N);
    }

    5、中位值平均滤波法(又称防脉冲干扰平均滤波法)

    #define N 12 
    
    char value_buf[N];
    char i=0;
    
    char filter()
    {
       char count;
       int  sum=0;
       value_buf[i++] = get_ad();
       if ( i == N )   i = 0;
       for ( count=0;count<N,COUNT++)
          sum = value_buf[count];
       return (char)(sum/N);
    }

    6、限幅平均滤波法
    略 参考子程序1、3
    7、一阶滞后滤波法
    /* 为加快程序处理速度假定基数为100,a=0~100 */

    #define a 50
    
    char value;
    
    char filter()
    {
       char  new_value;
       new_value = get_ad();
       return (100-a)*value + a*new_value; 
    }

    8、加权递推平均滤波法
    /* coe数组为加权系数表,存在程序存储区。*/
     

    #define N 12
    
    char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12};
    char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;
    
    char filter()
    {
       char count;
       char value_buf[N];
       int  sum=0;
       for (count=0,count<N;COUNT++)
       {
          value_buf[count] = get_ad();
          delay();
       }
       for (count=0,count<N;COUNT++)
          sum += value_buf[count]*coe[count];
       return (char)(sum/sum_coe);
    }

    9、消抖滤波法

    #define N 12
    
    char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12};
    char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;
    
    char filter()
    {
       char count;
       char value_buf[N];
       int  sum=0;
       for (count=0,count<N;COUNT++)
       {
          value_buf[count] = get_ad();
          delay();
       }
       for (count=0,count<N;COUNT++)
          sum += value_buf[count]*coe[count];
       return (char)(sum/sum_coe);
    }

    10、限幅消抖滤波法
    略 参考子程序1、9

    11、IIR滤波例子

    int  BandpassFilter4(int InputAD4)
    {
        int  ReturnValue; 
        int  ii;
        RESLO=0;
        RESHI=0;
        MACS=*PdelIn;
        OP2=1068; //FilterCoeff4[4];
        MACS=*(PdelIn+1);
        OP2=8;    //FilterCoeff4[3];
        MACS=*(PdelIn+2);
        OP2=-2001;//FilterCoeff4[2];
        MACS=*(PdelIn+3);
        OP2=8;    //FilterCoeff4[1];
        MACS=InputAD4;
        OP2=1068; //FilterCoeff4[0];
        MACS=*PdelOu;
        OP2=-7190;//FilterCoeff4[8];
        MACS=*(PdelOu+1);
        OP2=-1973; //FilterCoeff4[7];
        MACS=*(PdelOu+2);
        OP2=-19578;//FilterCoeff4[6];
        MACS=*(PdelOu+3);
        OP2=-3047; //FilterCoeff4[5];
        *p=RESLO;
        *(p+1)=RESHI;
        mytestmul<<=2;
        ReturnValue=*(p+1);
        for  (ii=0;ii<3;ii++)
        {
         DelayInput[ii]=DelayInput[ii+1];
         DelayOutput[ii]=DelayOutput[ii+1];
         } 
         DelayInput[3]=InputAD4;
         DelayOutput[3]=ReturnValue;     
        return ReturnValue;  
    }
    
    

     

    展开全文
  • DMA AD采样

    2019-07-05 15:51:45
    采样模块(交流采样) Valid_Voltage:采样所得交流信号有效值 adc_filter(FILTER_POINTS,Valid_Voltage_Flit):滤波函数,7个有效值滤波一次 TRUE_RMS(adc_tmp_Current,336):有效值计算函...
  • AD采样不准解决措施

    千次阅读 2019-02-14 22:13:13
    3:一般最好用到满量程,此时AD精度不浪费.  4:如果有偏置,需要进行自校.  5:请注意在使用DEMO板调试时,会由调试口导入PC噪声,由信号连接线导入外部噪声,因此建议使用屏蔽电缆传输信号.  6:板上注意模拟电源和数字...
  • “简简单单DSP”系列学习活动—第六期AD学习及使用“简简单单DSP”系列学习活动——第六期AD学习及使用2812的AD是一个12位的,实际只有一个AD转换器,但是有16个输入通道,通过内部模拟开关选择。这16个通道可以分为...
  • AD采样软件滤波

    2014-09-22 20:53:08
    比较全面的AD采样滤波教程,都是干活,是前人总结出来的经验,看了后少走弯路
  • 用于高速AD转换的VHDL程序,,包括了高速AD采样分析设计的全部源码
  • 51单片机AD模块PCF8591 1路AD采样+数码管显示+Proteus仿真 实例代码 #include<reg51.h> #include<intrins.h> typedef unsigned char uint8; typedef unsigned int uint16; typedef unsigned long ...
  • 首先思考一个问题,我们的世界是数字的还是模拟的?当然是模拟的了,所有的量都是在一定范围内连续变化的。我们为了能够更加方便的描述这些量,对它们进行了数字化。...AD转换器,英文全称为Analog-to...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,189
精华内容 7,675
关键字:

ad采样

友情链接: 小Q搜魂.rar