Other Parts Discussed in Thread: TM4C123GH6PM
主题中讨论的其他器件:TM4C123GH6PM、 TM4C123
我想在 EK-TM4C132GXL 开发板上执行 ADC 计算。 但我想使用 PWM 信号进行该计算。 简而言之、每次 PWM 信号处于上升沿时、我希望 ADC 在该时刻触发并采样、然后继续此过程、但我无法这么做、您能帮我吗? 
#include
#include
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/sysctl.h"
#include "driverlib/adc.h"
#define target_in_blizzard_RB1
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"
#include "driverlib/pin_map.h"
#include "driverlib/gpio.h"
#include "driverlib/pwm.h"
uint32_t ui32ADCAvg=0;
uint32_t ui32ADC0Value[8]={0};
uint32_t ui32Load=0;
int cnt = 0;
void handler_adc (void);
void adc_init (void);
void PWM_init (void);
int main (空)
{
//将系统时钟设置为80MHz 并启用外设 ADC0和 GPIO 端口 B 的时钟
SysCtlClockSet (SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHz);
//handler_adc();
PWM_init();
adc_init();
while (1)
{
//清除序列发生器0的 ADC 中断(如果已生成)
//ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[0]);
/*ADCSequenceDataGet (ADC0_BASE,1,\ui32ADC0Value[1]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[2]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[3]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[4]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[5]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[6]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[7]);*/
//触发序列发生器0的 ADC 采样
//ADCProcessorTrigger (ADC0_BASE、1);
//等待程序直到转换未完成
// while (ADCIntStatus (ADC0_BASE、1、false);
//将值存储到 ADC0的序列发生器0中的数组中
//计算读数的平均值
}
}
void ADC_init (void)
{
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
//SysCtlADCSpeedSet (SYSCTL_ADCSPEED_250kSPS);
//在 ADC0上启用硬件取平均值
ADCHardwareOversampleConfigure (ADC0_BASE、64);//
//配置为使用 ADC0、采样序列发生器0、处理器来触发序列并使用最高优先级
ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_PWM0、1);
//将 PB4配置为模拟输入引脚
//GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);
//将序列发生器0上的所有8个步骤配置为采样温度传感器
ADCSequenceStepConfigure (ADC0_BASE,1,0,ADC_CTL_CH0);
ADCSequenceStepConfigure (ADC0_BASE,1,1,ADC_CTL_CH0);
ADCSequenceStepConfigure (ADC0_BASE,1,2,ADC_CTL_CH0);
//ADCSequenceStepConfigure (ADC0_BASE、1、3、ADC_CTL_CH0);
/*ADCSequenceStepConfigure (ADC0_BASE,1,4,ADC_CTL_CH0);
ADCSequenceStepConfigure (ADC0_BASE,1,5,ADC_CTL_CH0);
ADCSequenceStepConfigure (ADC0_BASE,1,6,ADC_CTL_CH0);*/
//在序列发生器0上标记为最后一次转换,并在采样完成时启用中断标志生成
ADCSequenceStepConfigure (ADC0_BASE、1、3、ADC_CTL_CH0|ADC_CTL_IE|ADC_CTL_END);
ADCIntEnable (ADC0_BASE、1);
ADCIntRegister (ADC0_BASE、1、handler_ADC);
//启用序列发生器0
ADCSequenceEnable (ADC0_BASE、1);
//ADCIntClear (ADC0_BASE、0);
//ADCIntEnable (ADC0_BASE、0);
//IntEnable (ADC_INT_SS0);
ADCProcessorTrigger (ADC0_BASE、1);
}
void PWM_init (void)
{
//初始化 PB7 M0PWM1
SysCtlPWMClockSet (SYSCTL_PWMDIV_1);//在 SYSCTL.c 中定义的时钟
SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);// TM4C123GH6PM 有两个模块(0和1)
//SysCtlPeripheralEnable (SYSCTL_Periph_PWM1);// TM4C123GH6PM 有两个模块(0和1)
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
//GPIOPinTypePWM (GPIO_PORTB_BASE、GPIO_PIN_7);
GPIOPinTypePWM (GPIO_PORTB_BASE、GPIO_PIN_6);
GPIOPinConfigure (GPIO_PB6_M0PWM0);
//GPIOPinConfigure (GPIO_PB7_M0PWM1);
//IntEnable (INT_PWM0_0_TM4C123);
PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
ui32Load =(SysCtlClockGet ()/25000);
/*PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、ui32Load);
PWMPulseWidthSet (PWM0_BASE、PWM_OUT_1、900);
PWMOutputState (PWM0_BASE、PWM_OUT_1_BIT、TRUE);
PWMGenEnable (PWM0_BASE、PWM_GEN_0);*/
PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、ui32Load);
PWMGenIntTrigEnable (PWM0_BASE、PWM_GEN_0、PWM_TR_CNT_LOAD | PWM_TR_CNT_ZERO | PWM_INT_CNT_ZERO | PWM_INT_CNT_LOAD |
PWM_INT_CNT_AU | PWM_INT_CNT_AD | PWM_INT_CNT_BU |
PWM_INT_CNT_BD | PWM_TR_CNT_ZERO |
PWM_TR_CNT_LOAD | PWM_TR_CNT_AU | PWM_TR_CNT_AD |
PWM_TR_CNT_BU | PWM_TR_CNT_BD );
PWMGenEnable (PWM0_BASE、PWM_GEN_0);
PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、2700);
PWMOutputState (PWM0_BASE、PWM_OUT_0_BIT、TRUE);
}
void handler_adc (void)
{
ADCIntClear (ADC0_BASE、1);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[0]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[1]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[2]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[3]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[4]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[5]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[6]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[7]);
CNT++;
ui32ADCAvg =(ui32ADC0Value[0]+ui32ADC0Value[1]+ui32ADC0Value[2]+ui32ADC0Value[3]+ui32ADC0Value[4]+ui32ADC0Value[5]+ui32ADC0Value[6]+ui32ADC0Value[7]+ui32ADC0Value/ADC0Value[7]+ui32ADC0Value8);
}
