在线时间84 小时
UID353552
注册时间2012-4-17
NXP金币0
TA的每日心情 | 奋斗 2016-12-22 09:09 |
---|
签到天数: 12 天 连续签到: 1 天 [LV.3]偶尔看看II
高级会员

- 积分
- 876
- 最后登录
- 2019-3-8
|
下面是之前采用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);
}
|
|