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 值是无用的、完全没有意义。 我已经使用 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; } /********* 结束紧急停机 /
嗨、Chris、
很抱歉耽误了我的时间,假期让我很忙。 我回来后重新开始使用示例程序中的初始代码、发现了一些非常令人困惑的东西、但可能允许我全部帮助我弄清楚正在发生的事情。 使用提供的代码、如果我将 P4.1-6连接到声纳传感器、并将程序更改为具有随机读数且不会更改的引脚、如果我将其直接接地、则会更改为低编号(并非始终为0) 如果我将它们连接到3.3[V]、它们会提供大约16、300的高值。 如果我连接 ADC 并更改 P4.0、P4.7、P6.0-1、P5.0-2和 P 5.4-5的代码、它们现在都可以工作。 似乎将它们通过试验电路板连接到 MSP432是出于某种原因导致读数错误的。 尽管、如果我返回到原始代码并连接两个声纳传感器、它们可能起作用、如果我让它们保持稳定、它们将读取正确的值、然后在开始随机读取后再读取、直到再次开始提供正确的读数? 我确实注意到这些传感器数据表显示“读数可能每50mS (20Hz 速率)”,但在我的代码中,我没有给出读数速率,我只是使用“MAP_ADC14_enableModule()”,这可能会导致读数随机跳转? 如果我能够使读数保持稳定、我就不会真正担心其他引脚。 我正在使用 LV-MaxSonar MB1000声纳传感器。 www.maxbotix.com/.../LV-MaxSonar-EZ_Datasheet.pdf
//*-版权所有-、BSD //*版权所有(c) 2017、德州仪器(TI)公司 //*保留所有权利。 //* //*以源代码和二进制形式重新分发和使用,无论是否 进行//*修改,只要 满足以下条件//*: //* //*源代码的重新分发必须保留上述版权 //*注意事项、此条件列表和以下免责声明。 //* //**二进制形式的再发行必须复制上述版权 //*注意事项、此条件列表以及 随发行提供的//*文档和/或其他材料中的以下免责声明。 //* //**不 能使用 Texas Instruments Incorporated 的名称或//*其贡献者的名称来认可或推广未经特定事先书面许可从本软件派生的//*产品。 //* //*本软件由版权所有者和贡献者“按原样”提供 //*,任何明示或暗示的保证,包括但不限于 //*对适销性和对特定 用途适用性的暗示保证不承担责任//*。 在任何情况下、版权所有者或 //*贡献者都不对任何直接、间接、偶然、特殊、 //*模范、 或相应的损害(包括但不限于// *采购替代产品或服务;丧失使用、数据或利润; //*或业务中断)无论以 何种方式导致或基于任何责任理论,//*无论是在合同中、严格责任还是由于使用本软件而以任何方式产生的侵权行为(包括疏忽或//*其他), //*即使已被告知可能会发生此类损坏。 //*--/copyrights-*//********* //* MSP432 ADC14 -带 Timer_A 触发器的单通道连续采样 //* //*说明:在此 ADC14代码示例中,使用 标准3.3V 基准对单输入通道进行采样//*。 此 //*示例的样本触发源是 Timer_A CCR1。 ADC 设置为 在触发启动时从 A0持续采样/转换//*并将结果存储在 resultsBuffer 中(IT //*设置为循环缓冲区,其中 resPos 溢出到0)。 Timer_A 是 //*设置为向上计数模式、比较值16384设置为比较触发 //*和复位触发。 一旦 Timer_A 被启动、0.5秒后、它将触发 //* ADC14来启动转换。 本质上、该示例将使用 //* Timer_A 模块每隔0.5秒触发一次 ADC 转换。 //* //* MSP432P401 //* ---------- //* /|\| | //* || | //* -|RST P5.5 |<-- A0 (模拟输入) //* | | //* | | //* | | //* | | //* | | //* //********* /* DriverLib 包括*/ #include /*标准包括*/ #include #include /* Timer_A 连续模式配置参数*/ const Timer_A_UpModeConfig upModeConfig = { Timer_A_CLOCKSOURCE_ACLK、 // ACLK 时钟源 Timer_A_CLOCKSOURCE_divider _1、 // ACLK/1 = 32kHz 16384、 Timer_A_TAIE_INTERRUPT_DISABLE、 //禁用计时器 ISR Timer_A_CCIE_CCR0_INTERRUPT_DISABLE、//禁用 CCR0 Timer_A_do 清除 //清除计数 器}; // Timer_A 比较配置参数*/ const Timer_A_CompareModeConfig compareConfig = { Timer_A_CAPTURECOMPARE 寄存器_1、 //使用 CCR1 Timer_A_CAPTURECMOLE_INTERRUPT_DISABLE、//禁用 CCR 中断 Timer_A_OUTPUTMODE_SET_RESET、 //切换输出但是 16384 // 16000周期 }; //静态 易失性 uint_fast16_t resultsBuffer[uint8_MAX]; 静态易失性 uint8_t resPos; uint64_t currentresult; int main (void) { /*停止 WDT */ MAP_WDT_A_HOLDTimer(); MAP_Interrupt_enableSlepOnIsrExit(); RESPos = 0; /*设置时钟 * MCLK = MCLK = 3MHz * ACLK = REFO = 32kHz */ MAP_CS_initClockSignal (CS_ACLK、CS_REFOCLK_SELECT、CS_CLOCK_DELUGER_1); /*初始化 ADC (MCLK/1/1)*/ MAP_ADC14_enableModule(); MAP_ADC14_initModule (ADC_CLOCKSOURCE_MCLK、ADC_PREDIVIDER_1、ADC_DIVIDER_1、 0); /*配置 GPIO (5.5 A0)*/ MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P6、GPIO_PIN1、 GPIO_TICE_MODULE_FUNCTION); /*配置 ADC 内存*/ MAP_ADC14_configureSingleSampleMode (ADC_MEM0、TRUE); MAP_ADC14_configureConversionMemory (ADC_MEM0、ADC_VREFPS_AVCC_VREFNEG_VSS、 ADC_INPUT_A14、false); /*将 Timer_A 配置为连续模式并以 ACLK 为源*/ MAP_Timer_A_configureUpMode (timer_A0_BASE、&upModeConfig); /*在 CCR1中配置 Timer_A0以在16000 (0.5s)时触发*/ MAP_Timer_A_initCompare (timer_A0_BASE、&compareConfig); /*将样本触发器配置为来自 Timer_A0并进行设置 *在触发后自动迭代*/ MAP_ADC14_setSampleHoldTrigger (ADC_TRIGGER_SOURCE1、false); /*在通道1上的转换完成时启用中断、然后 *启用转换*/ MAP_ADC14_enableInterrupt (ADC_INT0); MAP_ADC14_enableConversion(); /*启用中断*/ MAP_Interrupt_enableInterrupt (INT_ADC14); MAP_Interrupt_enableMaster(); /*启动计时器*/ MAP_Timer_A_startCounter (TIMER_A0_BASE、TIMER_A_UP_MODE); /*正在休眠*/ while (1) { MAP_PCM_gotoLPM0 (); } } //此中断在转换完成后被触发,并放置在 * ADC_MEM0 */ void ADC14_IRQHandler (void) {中 uint64_t status; STATUS = MAP_ADC14_getEncableInterruptStatus(); MAP_ADC14_clearInterruptFlag (status); 当前结果= MAP_ADC14_getResult (ADC_MEM0); IF (STATUS & ADC_INT0) { if (resPos =uint8_MAX) { RESPos = 0; } resultsBuffer[resPos++]= MAP_ADC14_getResult (ADC_MEM0); } }
Brandon、
ADC 触发可以来自定时器、软件、也可以是自动的。 如果您选择自动模式、那么采样率将是采样保持时间加上转换所需时间的函数(14位结果为16个时钟)。 您可以参考 TRM 来了解如何计算该时间以及采样率。
数据表中定义了计时器触发源。 例如、如果您选择触发器1、即计时器 A0的捕获比较寄存器1。 当周期由 upMode 配置设置时、比较配置实际上会生成捕获比较1信号、从而生成 ADC 触发。 现在、比较配置的重要性取决于所选的模式。 如果使用扩展采样模式(这意味着 ADC 的内置采样保持计时器未被使用)、则设置计时器周期的向上计数模式配置将确定采样率。 比较配置用于确定采样保持时间。 请记住、TRM 指出、最大采样保持时间不应超过420us。 如果您使用脉冲采样模式(这意味着您在 ADC 内使用采样计时器)、则只需将采样保持时间设置为 ADC 时钟的函数(4的倍数)。 如果您再次将 IF 设置为自动模式、则定时器不相关、且采样频率是 ADC 采样和转换时序的函数。
在此 链接 中、您将找到不同模式的说明。 如果您尝试以10kHz 的速率测量所有7个通道、我建议使用定时器触发器的扩展采样模式。 突发模式、手动触发的重复自动扫描或自动触发的重复自动扫描都可以正常工作。
对于计时器、有几个注释。 24MHz 是您应该为任何外设提供的最大频率。 定时器周期始终为'+1'。 有一个额外的时钟用于从 CCR0进入1。 因此、如果您对 CCR0使用160、而对 CCR1使用160、则周期实际上为161、对于一个时钟周期、CCR1将处于活动状态(从160到0)。
此致、
Chris
Brandon、
请找到随附的示例。 从技术上讲、它会多次测量同一信道、但您可以将定义更改为多信道。 请参阅 PWM 配置中的时序说明以及 ADC 配置中的说明、以使用内部采样计时器、时间设置为8个 ADC 时钟、该时钟也来自24MHz SMCLK。
此致、
Chris