This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于ADC触发方式配置问题

Other Parts Discussed in Thread: TM4C123GH6PM

1.我想要设置采样为 ADC_TRIGGER_TIMER定时器触发,采样频率12.8K,每0.02s采样256次。
除了要ADCSequenceConfigure(ADC0_BASE, 0,ADC_TRIGGER_TIMEr, 0);这一句外,时间控制用什么来配置?
难道是通过配置采样频率为12.8K?程序会自动控制采样周期?SysCtlADCSpeedSet(SYSCTL_ADCSPEED_12.8KSPS)?

还是仍然要写定时器函数,然后在定时器中断中用ADCProcessorTrigger(ADC0_BASE, 0);语句来触发采样。

 如果在定时器中断内用语句触发,我觉得应该还是属于控制器软件触发,只是通过定时器来控制了触发频率。

而图中第二个定时器触发,是不是应该是设定好频率后自动触发,而不需要在定时器中断内反复执行触发语句。

2.使能了采样中断为普通模式,完成采样后是不是会自动进入ADC中断?中断触发有三种,软件触发、DMA、和模拟比较器,默认的中断触发是软件触发,是不是采样结束进入中断?

  • 查阅资料,代码有以下改进。
    ADCSequenceConfigure(ADC0_BASE, 0,ADC_TRIGGER_TIMER, 0);。。。。。。。

    ADCSequenceEnable(ADC0_BASE, 0);//使能ADC采集序列
            IntMasterEnable();
            IntEnable(INT_ADC0SS0); //使能ADC采样序列中断
            ADCIntEnable(ADC0_BASE, 0);
            //中断触发方式设置ADC_INT_SS0、ADC_INT_DMA_SS0、ADC_INT_DCON_SS0
            ADCIntEnableEx(ADC0_BASE,ADC_INT_SS0);//分别代表普通序列触发、DMA触发和数字比较器触发
            ADCIntClear(ADC0_BASE, 0);
            TimerControlTrigger(ADC0_BASE,TIMER_A,true);



    1.ADCIntEnableEx(ADC0_BASE,ADC_INT_SS0);中断触发方式设置为普通
    2.ADCProcessorTrigger(ADC0_BASE, 0);     应该改为    TimerControlTrigger(ADC0_BASE,TIMER_A,true);
    其中   第二位TIMER_A,第三位为true


    写了中断void ADC0IntHandler(void),在是startup里也注册了。

    但是关于TIMER_A该如何配置,我还是不怎么了解,请问有相关代码么?

  • 然后我发现有这么两个函数
    TimerADCEventSet(TIMER0_BASE,TIMER_ADC_TIMEOUT_A);这句是在定时器里配置当TIME_A超时后触发ADC
    TimerADCEventGet(TIMER0_BASE);这一个应该是获取是否触发超时ADC采样
    第一个放在TIMER的初始化里,但是第二句应该放在哪里呢
  • 我的理解是,定时器只能触发ADC的开始采样,触发完有个促发标志,你应该清除后才可以再次触发,解决你再次进不去的问题。

  • 可现在第一次就进不去,也没人给个案例的么。。。为什么论坛都没人的,只有大神你回复我

  • 不懂能怎么办,倒是你懂了可以吧程序发出来咩

  • /*************************************ADC部分*************************************/
    void ADC_INIT(void)
    {
    SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);//使能外设
    //SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);//使能GPIO
    //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,则指使用内部参考电压
    //配置ADC采集序列,ADC_TRIGGER_PROCESSOR是软件触发,ADC_TRIGGER_TIMER是定时器触发
    ADCSequenceConfigure(ADC0_BASE,0,ADC_TRIGGER_TIMER, 0);
    //ADCSequenceConfigure(ADC0_BASE, 0,ADC_TRIGGER_PROCESSOR, 0);
    ADCSequenceStepConfigure(ADC0_BASE, 0, 0, ADC_CTL_CH0 );//PE3/IC
    ADCSequenceStepConfigure(ADC0_BASE, 0, 1, ADC_CTL_CH1 );//PE2/IB
    ADCSequenceStepConfigure(ADC0_BASE, 0, 2, ADC_CTL_CH2 );//PE1/IA
    ADCSequenceStepConfigure(ADC0_BASE, 0, 3, ADC_CTL_CH3 );//PE0/VREF
    ADCSequenceStepConfigure(ADC0_BASE, 0, 4, ADC_CTL_CH4 );//PD3/VA
    ADCSequenceStepConfigure(ADC0_BASE, 0, 5, ADC_CTL_CH5 );//PD2/VB
    ADCSequenceStepConfigure(ADC0_BASE, 0, 6, ADC_CTL_CH6 | ADC_CTL_IE |ADC_CTL_END);//PD1/VC
    //ADCSequenceStepConfigure(ADC0_BASE, 0, 7, ADC_CTL_CH7 | ADC_CTL_IE |ADC_CTL_END);//PD0未使用
    //ADCIntRegister(ADC0_BASE,0, ADC0IntHandler);
    IntEnable(INT_ADC0SS0); //使能ADC采样序列中断
    ADCIntEnable(ADC0_BASE,0);
    IntPrioritySet(INT_ADC0SS0,0);//优先级0
    //ADCIntEnableEx(ADC0_BASE,ADC_INT_SS0);//分别代表普通序列触发、DMA触发和数字比较器触发
    ADCSequenceEnable(ADC0_BASE,0);//使能ADC采集序列
    //ADCIntEnableEx(ADC0_BASE,ADC_INT_DMA_SS0);
    IntMasterEnable();
    ADCIntClear(ADC0_BASE,0);
    }

  • /*************************************ADC部分*************************************/
    void ADC_INIT(void)
    {
    SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);//使能外设
    //SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);//使能GPIO
    //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,则指使用内部参考电压
    //配置ADC采集序列,ADC_TRIGGER_PROCESSOR是软件触发,ADC_TRIGGER_TIMER是定时器触发
    ADCSequenceConfigure(ADC0_BASE,0,ADC_TRIGGER_TIMER, 0);
    //ADCSequenceConfigure(ADC0_BASE, 0,ADC_TRIGGER_PROCESSOR, 0);
    ADCSequenceStepConfigure(ADC0_BASE, 0, 0, ADC_CTL_CH0 );//PE3/IC
    ADCSequenceStepConfigure(ADC0_BASE, 0, 1, ADC_CTL_CH1 );//PE2/IB
    ADCSequenceStepConfigure(ADC0_BASE, 0, 2, ADC_CTL_CH2 );//PE1/IA
    ADCSequenceStepConfigure(ADC0_BASE, 0, 3, ADC_CTL_CH3 );//PE0/VREF
    ADCSequenceStepConfigure(ADC0_BASE, 0, 4, ADC_CTL_CH4 );//PD3/VA
    ADCSequenceStepConfigure(ADC0_BASE, 0, 5, ADC_CTL_CH5 );//PD2/VB
    ADCSequenceStepConfigure(ADC0_BASE, 0, 6, ADC_CTL_CH6 | ADC_CTL_IE |ADC_CTL_END);//PD1/VC
    //ADCSequenceStepConfigure(ADC0_BASE, 0, 7, ADC_CTL_CH7 | ADC_CTL_IE |ADC_CTL_END);//PD0未使用
    //ADCIntRegister(ADC0_BASE,0, ADC0IntHandler);
    IntEnable(INT_ADC0SS0); //使能ADC采样序列中断
    ADCIntEnable(ADC0_BASE,0);
    IntPrioritySet(INT_ADC0SS0,0);//优先级0
    //ADCIntEnableEx(ADC0_BASE,ADC_INT_SS0);//分别代表普通序列触发、DMA触发和数字比较器触发
    ADCSequenceEnable(ADC0_BASE,0);//使能ADC采集序列
    //ADCIntEnableEx(ADC0_BASE,ADC_INT_DMA_SS0);
    IntMasterEnable();
    ADCIntClear(ADC0_BASE,0);
    }