查看: 3732|回复: 13

[分享] 使用KL25板卡实现的4路ADC采用例程-模数转换

[复制链接]
  • TA的每日心情
    奋斗
    2016-12-22 09:09
  • 签到天数: 12 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    24

    主题

    446

    帖子

    0

    高级会员

    Rank: 4

    积分
    876
    最后登录
    2019-3-8
    发表于 2015-6-8 13:09:36 | 显示全部楼层 |阅读模式
    下面是之前采用KL25板卡设计的4路模拟量采集的初始化程序,此采集是为采集交流电量所用:
    采集50hz的交流信号,每一个周波采集64点,采集是4路模拟量放入四个数组中,供程序的其它算法使用。
    程序流程:64点每个点的触发采集是通过定时器来实现采样频率,每个通道是通过软件触发的方式实现AD触发;
    大家有更好的多路采集思路望多多提建议,谢谢。
    把相关的程序段复制过来,存在不足,多多指教。
    #include "vectors.h"
    #include <MATH.H>

    #ifdef CMSIS
    #include "start.h"
    #endif

    #define NUM_caiy  64      //采集点数
    #define NUM_channel  2      //采集通道数

    float  dataR[64];
    float  U11,U12,I11,FFT_I1,FFT_I0,FFT_I2,correct_xi=0;

    uint32 i2[3][NUM_caiy]={0},i10=0;      //i10基准电压值
    uint8 ii=0,ii1=0;    //ii:通道号,ii1:采集点号
    uint8 correct_i=1;
    void Port_int()
    {
              PORTB_PCR18 |= PORT_PCR_MUX(1);//       
              PORTB_PCR19 |= PORT_PCR_MUX(1);//       
              PORTD_PCR1  |= PORT_PCR_MUX(1);//  ???
           
                    GPIOB_PDDR |= (1<<18) |(1<<19);//??
                    GPIOD_PDDR |= (1<<1);          //??

              //PORTE_PCR0 |= PORT_PCR_MUX(4);//        RTC-CLKOUT
              //PORTC_PCR3 |= PORT_PCR_MUX(5);//       
           
                    PORTB_PCR3 &= ~PORT_PCR_MUX_MASK; // analog  SE13
              PORTB_PCR2 &= ~PORT_PCR_MUX_MASK; // SE12
                    PORTB_PCR1 &= ~PORT_PCR_MUX_MASK; // SE9
                    PORTB_PCR0 &= ~PORT_PCR_MUX_MASK; // SE8
           
                    //PORTB_PCR3 |= PORT_PCR_MUX(0);//

    }
    void SIM_MCG_int()
    {
                    //MCG_C1        |=MCG_C1_IRCLKEN_MASK ;              //ENABLE MCGIRCLE
              SIM_SOPT2     |=SIM_SOPT2_CLKOUTSEL(8)//;          //7LPO clock 8MCGIRCLK 10 OSCERCLK  CLKOUT
                              |SIM_SOPT2_RTCCLKOUTSEL_MASK;      //0 RTC1Hz 1 OSCERCLK            RTC-CLKOUT
           
        //SIM_SOPT1     |=SIM_SOPT1_OSC32KSEL(0);          //0 osc32kclk 2 rtc-clkin 3lpo-1khz
           
              SIM_SCGC5     |=SIM_SCGC5_LPTMR_MASK;              //Low Power Timer Access Control
              SIM_SCGC6     |=SIM_SCGC6_ADC0_MASK;                                                                //ADC0 gate
           
              //SIM_SOPT7     |=(SIM_SOPT7_ADC0ALTTRGEN_MASK                                //enable alternative conversion triggers
                              // |SIM_SOPT7_ADC0TRGSEL(14));        //trigger select LPTMR0
    }
    /********************************************************************/
    void LTimer_int()
    {
              OSC0_CR       |=OSC_CR_ERCLKEN_MASK;            //3 OSCERCLK ENABLE

              LPTMR0_CSR    |=(LPTMR_CSR_TCF_MASK
                              |LPTMR_CSR_TIE_MASK);         //interrupt enable
                LPTMR0_PSR    |=(LPTMR_PSR_PRESCALE(7 )       //divides  PBYP?1??
                              |LPTMR_PSR_PBYP_MASK
                              |LPTMR_PSR_PCS(3));           //0 MCGIRCLE-48M 1LPO-1K 2ERCLK32-? 3OSCERCLK-8M
           
             LPTMR0_CMR     |=LPTMR_CMR_COMPARE(2500) ;           //32000_7-1s  2500_0-3200hz

              LPTMR0_CSR     |=LPTMR_CSR_TEN_MASK;        //timer enable   ??????        */

            enable_irq(LPTMR_irq_no);
            enable_irq(ADC0_irq_no);
              EnableInterrupts;             
    }
    void Adc0_int()
    {
            ADC0_SC1A     &=~ADC_SC1_ADCH_MASK;
            ADC0_CFG1     |=ADC_CFG1_ADICLK(1)               //clock divide select  bus clock 24M
                                                                            |ADC_CFG1_ADLSMP_MASK                                                        //long sample time
                                                                            |ADC_CFG1_MODE(3)                                                                  //conversion 8 12 10 16
                                                                            |ADC_CFG1_ADIV(1);                                         //        clock divide 1 2 4 8
            ADC0_CFG2     |=ADC_CFG2_ADHSC_MASK//;            //high-speed conversion
                                                                            //|ADC_CFG2_MUXSEL_MASK             //0 channel a   1 channel b
                                                                            |ADC_CFG2_ADLSTS(0);                //1  long sample time select 20 12 6 2
            ADC0_SC2      |=ADC_SC2_REFSEL(0)                ;                                                        //voltage reference
                                                                            //|ADC_SC2_ADTRG_MASK;                                                                        //hardware trigger   
            ADC0_SC3      |=//ADC_SC3_ADCO_MASK//;                                                                         //continuous conversion
                                                                            ADC_SC3_AVGE_MASK                  //hardware average enable
                                                                            |ADC_SC3_AVGS(0) ;                                                                        //Hardware average
            ADC0_SC1A     |=(ADC_SC1_ADCH(8) //);                 //channel select
                                                                            |ADC_SC1_AIEN_MASK);             //ENABLE interrupt
    }


    void LPTimer_IRQHandler(void)
    {
            uint32 a=0;
              LPTMR0_CSR    |=LPTMR_CSR_TCF_MASK ;
                    a=ADC0_SC1A&(~ADC_SC1_ADCH_MASK);
                    a|=ADC_SC1_ADCH(8);
              ADC0_SC1A           =a;               
                    ii=0;
                    if(ii1==NUM_caiy)
                    {ii1=1;}
                    else
              {ii1++;}
                    //GPIOB_PTOR=(1<<18);
    }

    回复

    使用道具 举报

  • TA的每日心情

    2017-5-27 11:02
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    15

    主题

    566

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1890
    最后登录
    2017-5-27
    发表于 2015-6-8 15:04:40 | 显示全部楼层
    学习一下,ADC
    klntuo累
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    17

    主题

    244

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    339
    最后登录
    1970-1-1
    发表于 2015-6-8 17:18:49 | 显示全部楼层
    学习了!嘿嘿嘿
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-1-17 10:45
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    38

    主题

    395

    帖子

    3

    高级会员

    Rank: 4

    积分
    780
    最后登录
    2023-11-17
    发表于 2015-6-8 17:30:19 | 显示全部楼层
    可以用PIT定时器触发一路DMA,用让DMA的写操作触发ADC,然后用ADC的转换结果触发另一路DMA将转换结果搬运到一块内存中。这种用法在监控类应用中比较典型。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-4-12 10:22
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    15

    主题

    386

    帖子

    0

    高级会员

    Rank: 4

    积分
    541
    最后登录
    2018-6-28
    发表于 2015-6-8 17:52:31 | 显示全部楼层
    学习了
    falajf
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-10-18 11:35
  • 签到天数: 9 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    21

    主题

    945

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2001
    最后登录
    2020-6-8
    发表于 2015-6-9 09:04:48 | 显示全部楼层
    学习一下,ADC
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-5-7 09:07
  • 签到天数: 353 天

    连续签到: 1 天

    [LV.8]以坛为家I

    141

    主题

    8056

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5785
    最后登录
    2025-5-7
    发表于 2015-6-9 12:51:14 | 显示全部楼层
    谢谢分享
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-12-22 09:09
  • 签到天数: 12 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    24

    主题

    446

    帖子

    0

    高级会员

    Rank: 4

    积分
    876
    最后登录
    2019-3-8
     楼主| 发表于 2015-6-9 15:32:43 | 显示全部楼层
    多多交流
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-12-22 09:09
  • 签到天数: 12 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    24

    主题

    446

    帖子

    0

    高级会员

    Rank: 4

    积分
    876
    最后登录
    2019-3-8
     楼主| 发表于 2015-6-9 16:06:35 | 显示全部楼层
    suyong_yq 发表于 2015-6-8 17:30
    可以用PIT定时器触发一路DMA,用让DMA的写操作触发ADC,然后用ADC的转换结果触发另一路DMA将转换结果搬运到 ...

    嗯,是我不知道的思路,主要是没注意过DMA,回去好好看看,这样能优化程序,谢谢
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-1-17 10:45
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    38

    主题

    395

    帖子

    3

    高级会员

    Rank: 4

    积分
    780
    最后登录
    2023-11-17
    发表于 2015-6-10 10:24:44 | 显示全部楼层
    digua96 发表于 2015-6-9 16:06
    嗯,是我不知道的思路,主要是没注意过DMA,回去好好看看,这样能优化程序,谢谢 ...

    是的,在这种情况下,配置好之后,CPU就完全不介入了。到时候读取转换数据可以实现零等待,而且适合低功耗。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-27 17:45 , Processed in 0.101589 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表