我的代码运行得非常好。 它仍然可以正常工作、运行正常、只是我的 ADC 值是无用的、完全没有意义。 我已经使用 P4.7进行了测试、但希望测试我的空闲状态、因此我将 P4.1-4.6连接到了5[V]、这样它们的读数会很高且不会导致中断、因此我可以将其隔离到 P4.7。 在我这么做之后、我的所有值都是随机执行的。 我断开了所有引脚的连接、仅连接了 P4.7、现在所有 ADC 结果都是随机的超大数字或小数字或任何东西。 我将手移到离我的声纳传感器较远且靠近的位置、ADC 读数不提供模式或逻辑读数。 我知道代码运行得非常好、因为我运行它几个小时、测试的东西都非常完美。 我想知道是否有人可以帮助我了解我将所有这些引脚连接到5[V]时所做的工作、以及如何将其反向。 若要运行代码、请打开: Resource Explorer > MSP432P401R LaunchPad -红色2.x (红色)> SimpleLink MSP432P4 SDK - v:2.30.00.14 > Examples > Development Tools > MSP432P401R LaunchPad -红色2.x (红色)> DriverLib > adc14_single_converation_era > RTOS Compiler > No Project Import to Source
复制并粘贴我的代码、它将正常运行。
/* DLUG = MSP432_DriverLib_Users_Guide-MSP432P4xx-2_20_00_08 */ /*按住命令并单击任何 API 以查看有关它的信息 /* DriverLib 包括*/ #include /*标准包括*/ #include #include /* for usleep()*//#include //#include /* TI-RTOS 头文件*/ #include //#include /*电路板头文件*/ //#include "Board.h" //*静态*/ uint16_t resultsBuffer[7];//缓冲器以保存每个声纳传感器的 ADC 读数 // DLUG 部分:2.6.2.25 |注册 ADC 中断的中断处理程序。 // void ADC14_registerInterrupt (void (* ADC14_IRQHandler)(void)); void PWMConfigure (void);//设置 PWM void ADCConfigure (void);//设置 ADC void InitDCO (void);//更改 DCO Sonarive (void)的运行频率; SonarTwo (void); void (void (void );void (void);void (void);void (void);void (void (void);void (void) void SonarSix (void); void SonarSeven (void); void 应急停止(void); /******** 右侧电机的 Timer_A PWM 配置参数***** *按住命令并单击 Timer_A_PWMConfig 以查看 pwmConfigR 是 typedef 结构_Timer_A_PWMConfig *S1用于右侧电机*/ Timer_A_PWMConfig pwmConfigR = { Timer_A_CLOCKSOURCE_SMCLK、// PWM 运行时钟源 Timer_A_CLOCKSOURCE_DEVIDER_1、//时钟源 SMCLK 的分频器 4800、//周期 Timer_A_CAPTURECOMPARE 寄存器3、 Timer_A_OUTPUTMODE_RESET_SET、 2400//start、占空比为5[V](2.5[V])的50%、因此电机不会移动。 }; /******** 左侧电机的 Timer_A PWM 配置参数***** *S2用于左侧电机*/ Timer_A_PWMConfig pwmConfigL = { Timer_A_CLOCKSOURCE_SMCLK、 Timer_A_CLOCKSOURCE_divider _1、 4800、 Timer_A_CAPTURECOMPARE 寄存器_4、//使 P2.7正常工作是因为 TA0.4 Timer_A_OUTPUTMODE_RESET_SET、 2400 }; /********* 两个电机的结束定时器_A_PWMConfig *电机以方向和速度为一个输入。 51-100%占空比是正向速度(5[V]最大值、 *更高占空比是更快的正向速度)、0-49%占空比是反向速度(0[V]最大值、较低占空 比*周期是更快的反向速度)、50%是无运动(2.5[V])。 * *我们希望使用大约一半的每个方向占空比、因为我们不想快速运行。 每个方向 *具有2400级速度。 每种模式的一半是1、200级速度。 正向可以具有 * 2、401-4、800的占空比、而反向可以具有0 - 2、399的占空比。 我们将使用前向:2、401-3、600和 *后向:1、200 - 2、399 */ ********* 启动 main******** / int main (void) { /*停止 WDT */ MAP_WDT_A_HOLDTimer(); PWMConfigure();//设置 PWM ADCConfigure();//设置 ADC MAP_Interrupt_enableSlepOnIsrExit(); /*正在休眠*/ while (1) { MAP_PCM_gotoLPM0 ();//sleep while no interrupts are ocrupting. } }//end main /********* 结束 main******** / void SonarOne (void){//P4.1 & resultsBuffer[6] MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN0);//LED1 (左侧) MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN1); } void SonarTwo (void){//P4.2和 resultsBuffer[5] MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN1);//LED2 (右侧) MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN0); } void SonarThree (void){//P4.3 & resultsBuffer[4] } void SonarFour (void){//P4.4 & resultsBuffer[3] } void SonarFive (void){//P4.5 & resultsBuffer[void } *(void)/Outsisoid S4.7 & sOutsOutsOutsOutsOutsOutsOutsOuts缓冲 区(void)}*(void)/OutsOutsOutsOutsOutsOutsOutsOutsOutsOutsOutsOutsOuts缓冲 区(void 启动 ADC 处理程序******** // //*只要 Sonar Reading 是比较器所说的内容并且 MAP_ADC14_enableInterrupt (X)所说的内容,就会触发此中断。 */ void ADC14_IRQHandler (void) { uint64_t status; STATUS = MAP_ADC14_getEncableInterruptStatus ();//获取中断状态以进行比较 MAP_ADC14_clearInterruptFlag (status);//清除中断标志以进行下一次中断检查 IF (STATUS 和 ADC_LO_INT) { // map_ADC14_getMultiSequenceResult (resultsBuffer); resultsBuffer[0]= MAP_ADC14_getResult (ADC_MEM0);//P4.7 resultsBuffer[1]= MAP_ADC14_getResult (ADC_MEM1);//P4.6 resultsBuffer[2]= MAP_ADC14_getResult (ADC_MEM2);//P4.5 resultsBuffer[3]= MAP_ADC14_getResult (ADC_MEM3);//P4.4 resultsBuffer[4]= MAP_ADC14_getResult (ADC_MEM4);//P4.3 resultsBuffer[5]= MAP_ADC14_getResult (ADC_MEM5);//P4.2 resultsBuffer[6]= MAP_ADC14_getResult (ADC_MEM6);//P4.1 } if ((resultsBuffer[0]< 550)||(resultsBuffer[1]< 550)||(resultsBuffer[2]< 550)||(resultsBuffer[3]< 550)||(resultsBuffer[4]< 550)||(resultsBuffer[6]< 550)))(对象关闭时亮起(红色) SonarOne(); } 其他{//LED 2在物体较远时亮起(绿色) SonarTwo(); } }//end ADC14中断处理程序 /********* 结束 ADC 处理程序******** / /********* 启动端口1处理程序******** / /* Port1 ISR -此 ISR 将逐步升高 PWM 的占空比 *在按钮上按*/ void Port1_IRQHandler (void) { uint32_t status = MAP_GPIO_getEnabledInterruptStatus (GPIO_PORT_P1);//P2.7棕色线 MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、状态); IF (STATUS & GPIO_PIN1) { if (pwmConfigL.dutyCycle = 4800 && pwmConfigR.dutyCycle = 4800){ pwmConfigL.dutyCycle = 480; pwmConfigR.dutyCycle = 480;} 否则{ pwmConfigL.dutyCycle += 480; pwmConfigR.dutyCycle += 480;} MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfigL); } }//end 端口1中断处理程序 /********* 结束端口1处理程序******** / /********* 启动 PWM 配置'******** / void PWMConfigure(){ InitDCO ();//将时钟频率更改为48[MHz] /* DLUG 部分:6.6.2.18 |初始化 SMCLK 至 DCOCLK 频率除以1*/ MAP_CS_initClockSignal (CS_SMCLK、CS_DCOCLK_SELECT、CS_CLOCK_DIVIDER_1); /*将 GPIO2.7配置为右侧电机 PWM 的外设输出和 *为左侧电机配置 GPIO2.6作为 PWM 的外设输出、为按钮中断配置 P1.1 */ MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN7、GPIO_PRIMARY_MODULE_Function);//P2.7 (右侧电机) MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN6、GPIO_PRIMARY_MODULE_Function);//P2.6 (左侧电机) MAP_GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P1、GPIO_PIN1);//设置端口1上的引脚1 MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、GPIO_PIN1); MAP_GPIO_enableInterrupt (GPIO_PORT_P1、GPIO_PIN1); // Interrupt_setPriority (INT_PORT1、0); /* DLUG 部分:12.4.2.4 |在端口1上为按钮启用中断*/ MAP_Interrupt_enableInterrupt (INT_Port1); /* DLUG 部分:24.2.11 |生成计时器在向上计数模式下运行的 PWM。 时钟设置为48[MHz]、 即0.0208333[us][微秒](2.08s*10^-8)。 每个计时器的设置周期为4、800 *周期、因此周期为0.0001[s]、频率为1/.0001 = 10[kHz]*/ MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfigR); MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfigL); }//结束 PWM 配置 /********* 结束 PWM 配置'******** / /********* 启动 ADC 配置******** / void ADCConfigure(){ /* DLUG 部分:2.6.2.14 |这将启用 ADC 块的运行。 * MAP_ADC14_enableModule (); // MAP_ADC14_initModule (ADC_CLOCKSOURCE_ADCOSC、ADC_PREDIVIDER_1、ADC_DIVIDER_1、 // 0); /*在端口4引脚1-7 (包括*/)上为第三功能和输入配置 GPIO MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P4、GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7、GPIO_TICE_MODULE_FUNCTION); /*将板载 LED1和 LED2设置为输出并将其初始化为低电平*/ MAP_GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0); MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN0);//LED1 (左侧和红色) MAP_GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN1); MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN1);//LED2 (右侧和绿色) // MAP_GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN2); /* DLUG 部分:2.6.2.3 |配置 ADC 存储器(ADC_MEM0 - ADC_MEM6 (A6 - A12)、不再重复) *使用内部3.3[V]基准*/ MAP_ADC14_configureMultiSequenceMode (ADC_MEM0、ADC_MEM6、TRUE); /* DLUG 部分:2.6.2.2 |为每个 ADC 模块配置单独的存储器位置。 *(内存位置、电压基准类型、所使用的通道 * ADC 采样、非差分输入为 false)*/ //ADC_VREFPOS_INTBUF_VREFNEG_VSS (提供2.5[V]基准电压) MAP_ADC14_configureConversionMemory (ADC_MEM0、 ADC_VREFPOS_AVCC_VREFNEG_VSS、ADC_INPUT_A6、false);//ADC6 = P4.7 = MEM0 MAP_ADC14_configureConversionMemory (ADC_MEM1、 ADC_VREFPOS_AVCC_VREFNEG_VSS、ADC_INPUT_A7、false);//ADC7 = P4.6 = MEM1 MAP_ADC14_configureConversionMemory (ADC_MEM2、 ADC_VREFPOS_AVCC_VREFNEG_VSS、ADC_INPUT_A8、false);//ADC8 = P4.5 = MEM2 MAP_ADC14_configureConversionMemory (ADC_MEM3、 ADC_VREFPOS_AVCC_VREFNEG_VSS、ADC_INPUT_A9、false);//ADC9 = P4.4 = MEM3 MAP_ADC14_configureConversionMemory (ADC_MEM4、 ADC_VREFPOS_AVCC_VREFNEG_VSS、ADC_INPUT_A10、false);//ADC10 = P4.3 = MEM4 MAP_ADC14_configureConversionMemory (ADC_MEM5、 ADC_VREFPOS_AVCC_VREFNEG_VSS、ADC_INPUT_A11、false);//ADC11 = P4.2 = MEM5 MAP_ADC14_configureConversionMemory (ADC_MEM6、 ADC_VREFPOS_AVCC_VREFNEG_VSS、ADC_INPUT_A12、false);//ADC12 = P4.1 = MEM6 /* DLUG 部分:2.6.2.16 |将采样定时器设置为自动单步执行序列转换 *一个采样/转换完成后,ADC 模块将自动继续到下一个采样。*/ MAP_ADC14_enableSampleTimer (ADC_AUTOMATE_DIOTIVation); /*DLUG 部分:2.6.2.11 |启用指定的内存通道掩码以使用指定的比较器窗口。 。 ADCC 模块有两个不同的比较器窗口、可通过此功能进行设置。*/ ADC14_enableComparatorWindow (ADC_MEM0 | ADC_MEM1 | ADC_MEM2 | ADC_MEM3 | ADC_MEM4 | ADC_MEM5 | ADC_MEM6、 ADC_COMP_WINDOW0); // ADC14_enableComparatorWindow (ADC_MEM0 | ADC_MEM1 | ADC_MEM2 | ADC_MEM3 | ADC_MEM4 | ADC_MEM5 | ADC_MEM6、 // ADC_COMP_WINDOW1); /* DLUG 部分:2.6.2.26 |设置指定窗口比较器的下限和上限。 *(窗口0或窗口1、下限、上限)*/ ADC14_setComparatorWindowValue (ADC_COMP_WINDOW0、550、2000); // ADC14_setComparatorWindowValue (ADC_COMP_WINDOW1、550、2000); /* DLUG 部分:2.6.2.13 |当通道降至比较器阈值以下时启用中断、 *如果使用 ADC_HI_INT 在通道高于比较器或的阈值时启用中断 *当通道处于超薄阈值时、ADC_IN_INT 启用中断通道* MAP_ADC14_enableInterrupt (ADC_LO_INT); // MAP_ADC14_enableInterrupt (ADC_HI_INT); // MAP_ADC14_enableInterrupt (ADC_IN_INT); /* DLUG 部分:12.4.2.4 - 12.4.2.5 |启用中断*/ MAP_Interrupt_enableInterrupt (INT_ADC14); // Interrupt_setPriority (INT_ADC14、0); MAP_Interrupt_enableMaster(); /* DLUG 部分:2.6.2.12和2.6.2.32|启用 ADC 数据转换。 触发采样开始。 *通过切换触发软件位来切换 ADC 模块转换的触发器。*/ MAP_ADC14_enableConversion(); MAP_ADC14_toggleConversionTrigger (); }//end ADC 配置 /********* 结束 ADC 配置******** / /********* 启动 DCO 初始化******** /void InitDCO (){ /* DLUG 部分:9.3.2.4 |启用浮点单元。 * FPU_enableModule(); /* DLUG 部分:14.7.2.16 |设置内核电压电平(Vcore)。 函数将会 *注意在内核电压电平之间切换所需的所有电源状态转换。 *在开始之前、我们必须将 VCORE 更改为1以支持48MHz 频率*/ PCM_setCoreVoltageLevel (PCM_AM_LDO_VCORE1); /* DLUG 部分:8.4.2.22 |更改闪存使用的等待状态数 用于读取操作的*控制器。 当改变时钟的频率范围时、这就是 必须使用*函数才能支持可读闪存。*/ FlashCtl_setWaitState (FLASH_BANK0、1); FlashCtl_setWaitState (FLASH_BANK1、1); /* DLUG 部分:6.6.2.21 |将 DCO 工作的中心频率设置为[32MHz 至64MHz]。 * MAP_CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY 48); /* DLUG 部分:9.3.2.1 |禁用浮点单元。 * FPU_disableModule (); }//结束 DCO 初始化 /********* 结束 DCO 初始化代码 / /********* 启动紧急停止功能 / void 应急停止(){ pwmConfigL.dutyCycle = 2400; pwmConfigR.dutyCycle = 2400; } /********* 结束紧急停机 /