本帖最后由 djz1992 于 2016-1-22 14:00 编辑
1.我想要设置采样为 ADC_TRIGGER_TIMER定时器触发,采样频率12.8K,每0.02s采样256次。
除了要ADCSequenceConfigure(ADC0_BASE, 0,ADC_TRIGGER_TIMEr, 0);这一句外,时间控制用什么来配置?
难道是通过配置采样频率为12.8K?程序会自动控制采样周期?SysCtlADCSpeedSet(SYSCTL_ADCSPEED_12.8KSPS)?
2.采样完成后是不是会自动进入ADC中断?中断触发有三种,软件触发、DMA、和模拟比较器,@xyz549040622 默认的中断触发是软件触发,是不是采样结束进入中断?
我在中断里把瞬时值保存到数组,然后在主函数将256个数据求平方和后开方,就得到了交流电压的有效值。
求有效值的代码我写好了。以下是我的采样配置部分的代码,帮我看看我的理解写的备注是否正确,另外是否可以实现我所需要的功能。
//初始化ADC0/PE3
//SysCtlADCSpeedSet(SYSCTL_ADCSPEED_500KSPS);//设置采样速度,默认1MHZ
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
GPIOPinTypeADC(GPIO_PORTD_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
//设置ADC参考电压为外部3V,TM4C123GH6PM只能使用内部参考电压,3.3V
//ADCReferenceSet(ADC0_BASE, ADC_REF_EXT_3V);//若ADC_REF_INT,则指使用内部3V参考电压
//配置ADC采集序列,ADC_TRIGGER_PROCESSOR是软件触发,ADC_TRIGGER_TIMER是定时器触发
ADCSequenceConfigure(ADC0_BASE, 0,ADC_TRIGGER_TIMER, 0);
ADCSequenceStepConfigure(ADC0_BASE, 0, 0, ADC_CTL_CH0 );//PE3
ADCSequenceStepConfigure(ADC0_BASE, 0, 1, ADC_CTL_CH1 );//PE2
ADCSequenceStepConfigure(ADC0_BASE, 0, 2, ADC_CTL_CH2 );//PE1
ADCSequenceStepConfigure(ADC0_BASE, 0, 3, ADC_CTL_CH3 );//PE0
ADCSequenceStepConfigure(ADC0_BASE, 0, 4, ADC_CTL_CH4 );//PD3
ADCSequenceStepConfigure(ADC0_BASE, 0, 5, ADC_CTL_CH5 );//PD2
ADCSequenceStepConfigure(ADC0_BASE, 0, 6, ADC_CTL_CH6 | ADC_CTL_IE |ADC_CTL_END);//PD1
ADCSequenceEnable(ADC0_BASE, 0);//使能ADC采集序列
IntMasterEnable();//总中断使能
IntEnable(INT_ADC0SS0); //使能ADC采样序列中断
ADCIntEnable(ADC0_BASE, 0);//这一句和上一句是不是一个意思?
ADCIntEnableEx(ADC0_BASE,ADC_INT_DMA_SS0);//中断触发设置
ADCIntClear(ADC0_BASE, 0);
void ADC0IntHandler(void)
{
ADCSequenceDataGet(ADC0_BASE, 0, ADC0_Value);
for(i=0;i<8;i++)
{VALUE【i】=VALUE【i】+(ADC0_Value【i】* ADC0_Value【i】);}
结论已经有了,请看到最后!!
|