尊敬的支持人员:
我尝试使用电位器读取4个 ADC 信号、并生成 PWM 来测试它。
我遵循了以下代码: e2e.ti.com/.../374763
尽管我物理连接不同的端口、但 ui32adcValues[0]中的值始终会发生更改。 可能我没有正确获取或理解代码。
// //库 //********* #include #include #include "driverlib/gpio.h" #include "driverlib/pin_map.h" #include "driverlib/rom.h" #include "driverlib/rom_map.h" #include "driverlib/pin.h" #include "driverlib/mware.h" #include "drivers.h"#include "driverlib/simme.h" #include "drivers.h"#include "drivers.包含"drivers.hw_intruart"#include "#包含"#drivers.h"#drivers.h"#drivers.hw_inuart.h"#include "#include "#include "inuart.h"#include "#include "#"inuart.h" //为计时 器#include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "inc/hw_adc.h" #include "inc/hw_timer.h" #include "inc/hw_NVIC.h" #include "inc/hw_sysctl.h" #include "utils/uartdio.h * //变量声明 //********* // ADC uint32_t ui32adcValues[4]、ui32Count、ui32adc0Values[1]、ui32adc1Values[1]、ui32adc2Values[1]、ui32adc3Values[1]; // PWM long analogs=0、ui32adc2Values[1]、ui32adc3Valuatui000=ui000=ui000=uw32、uatuatuuuuuuuu000=uuuuuuuuuuuuuu000=u000u000uu000uuu000u000u000uuuu000uuu000u // 120MHz/5kHz //系统 uint32_t g_ui32SysClock; //系统时钟速率,单位为 Hz。 // // //如果驱动程序库遇到错误,则调用的错误例程。 //// ***************** #ifdef debug void __error__(char *dpcFilename、uint32_t ui32Line) { #endif //********* // ADC 初始化 //************* void ConfigureADC (void) { SysCtlPeripheralReset (SYSCTL_Periph_GPIOE); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE); SysCtlPeripheralReset (SYSCTL_Periph_ADC0); SysCtlPeripheralEnable (SYSCTL_Periph_ADC0); SysCtlDelay (10); GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1 | GPIO_PIN_0); ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_Eighth、30); //选择序列发生器2并将其设置为最高优先级。 ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_ALE一直、0); ADCSequenceConfigure (ADC0_BASE、1、ADC_TRIGGER_ALE一直、1); ADCSequenceConfigure (ADC0_BASE、2、ADC_TRIGGER_ALE一直、2); ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_ALE一直、3); //选择序列发生器2中的 Step 0作为数据缓冲区,将其设置为 Last Step 并启用中断 ADCSequenceStepConfigure (ADC0_BASE、0、0、ADC_CTL_CH0); ADCSequenceStepConfigure (ADC0_BASE、0、1、ADC_CTL_CH1); ADCSequenceStepConfigure (ADC0_BASE、0、2、ADC_CTL_CH2); ADCSequenceStepConfigure (ADC0_BASE、0、3、ADC_CTL_CH3 | ADC_CTL_IE | ADC_CTL_END); ADCSequenceEnable (ADC0_BASE、0); ADCSequenceEnable (ADC0_BASE、1); ADCSequenceEnable (ADC0_BASE、2); ADCSequenceEnable (ADC0_BASE、3); } //********* // PWM 初始化- 13.09.2020 //********* void Init_PWM (){ // 1. SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF); //启用端口 F while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOF)); // 2. SysCtlPWMClockSet (SYSCTL_PWMDIV_16); SysCtlPeripheralDisable (SYSCTL_Periph_PWM0); SysCtlPeripheralReset (SYSCTL_Periph_PWM0); SysCtlPeripheralEnable (SYSCTL_Periph_PWM0); while (!(SysCtlPeripheralReady (SYSCTL_Periph_PWM0))); // PWM0_BASE:0 -> 0来自 M_0_PWM1 // PWM_OUT_1和 PWM_OUT_1_BIT:1来自 M0PWM_1 // PWM_GEN_0:针对 PWM0和 PWM1的 GEN_0、针对 PWM2和 PWM3的 GEN_1…… SysCtlPWMClockSet (SYSCTL_PWMDIV_1); // 120MHz/1 = 120MHz GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_1); //端口 F - PF1的引脚1 GPIOPinConfigure (GPIO_PF1_M0PWM1); PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC); PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、pwmMax); // 120MHz/pwmMax = pwmPeriod PWMPulseWidthSet (PWM0_BASE、PWM_OUT_1、1); PWMGenEnable (PWM0_BASE、PWM_GEN_0); PWMOutputState (PWM0_BASE、PWM_OUT_1_BIT、TRUE); PWMIntEnable (PWM0_BASE、PWM_INT_GEN_0); IntMasterEnable(); PWMGenIntTrigEnable (PWM0_BASE、PWM_GEN_0、PWM_TR_CNT_ZERO); IntEnable (INT_PWM0_0); } //********* //等待并读取 ADC 函数 //********* uint32_t WaitAndReadADC (uint32_t * adcValues) { ADCProcessorTrigger (ADC0_BASE、0); //等待采样序列完成。 while (!ADCIntStatus (ADC0_BASE、0、false)){} //从 ADC 读取值。 return (ADCSequenceDataGet (ADC0_BASE、0、adcValues)); } uint32_t WaitAndReadADC1 (uint32_t * adcValues) { ADCProcessorTrigger (ADC0_BASE、1); //等待采样序列完成。 while (!ADCIntStatus (ADC0_BASE、1、false)){} //从 ADC 读取值。 return (ADCSequenceDataGet (ADC0_BASE、1、adcValues)); } uint32_t WaitAndReadADC2 (uint32_t * adcValues) { ADCProcessorTrigger (ADC0_BASE、2); //等待采样序列完成。 while (!ADCIntStatus (ADC0_BASE、2、false){} //从 ADC 读取值。 return (ADCSequenceDataGet (ADC0_BASE、2、adcValues); } uint32_t WaitAndReadADC3 (uint32_t * adcValues) { ADCProcessorTrigger (ADC0_BASE、3); //等待采样序列完成。 while (!ADCIntStatus (ADC0_BASE、3、false)){} //从 ADC 读取值。 return (ADCSequenceDataGet (ADC0_BASE、3、adcValues)); } int main (void) { // //从 PLL 以120MHz 运行。 // G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000); // //配置器件引脚。 // PinoutSet (false、false); // //为 LED D1 (PN1)启用 GPIO 引脚。 // ROM_GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_1); // //初始化 UART。 // ConfigureADC(); init_pwm (); adcToPwmRatio = pwmMax/4095; // 2^12位 //无限循环 while (1) { //ui32Count = WaitAndReadADC1 (ui32adcValues); //ui32Count = WaitAndReadADC2 (ui32adcValues); //ui32Count = WaitAndReadADC3 (ui32adcValues); ui32Count = WaitAndReadADC (ui32adcValues); //求和过滤器 if (sumCounter < iSamples){ analogValue = ui32adcValues[0]+ analogValue; sumCounter++; } 否则{ analogAvg = analogValue /iSamples; // PWM pwmValue = analogAvg*adcToPwmRatio; // PWM 最小限制 if (pwmValue < 30){ pwmValue = 1; // pwmValue 永远不能为零 } // PWM 最大限制 if (pwmValue >(pwmMax - 30)){ pwmValue = pwmMax; } //更改 PWM 值 PWMPulseWidthSet (PWM0_BASE、PWM_OUT_1、pwmValue); //重置总和过滤器变量 analogValue = 0; 总和计数器= 0; } }
请提供一些帮助吗?
此致、
Gustavo Wegher
