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.

[参考译文] MSP432P401R:MSP432P401R

Guru**** 2001295 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/758590/msp432p401r-msp432p401r

器件型号:MSP432P401R

我的代码运行得非常好。 它仍然可以正常工作、运行正常、只是我的 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;
}
/********* 结束紧急停机 /

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    绝对最大额定值[DS sec 5.1]假设对任何引脚施加的电压不超过4.17V。 它并不总是会损坏某些东西、但它可能会损坏。

    您还有其他 Launchpad 吗? 能否在 P5/P6上使用 ADC 输入?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的 ADC 切换到了 P5.0-2、P4.7、P4.0和 P6.0-1、它们正常工作。 我有另一个可以在明天测试的测试。 我很可能已经炸过其他引脚。 我的错误是在我插入它们之前没有考虑两次。 明天我将在检查另一个时发布、以便您可以关闭它!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我很高兴您能正常工作。 作为一个 klutz、我尝试成对购买我的 Launchpad。 (我的专长是将东西插回。)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我将代码连接到我们的其他 MSP432、这些引脚看起来也根本不响应传感器读数。 我将声纳连接到 P4.7、它工作正常、但当我切换并连接4.1-4.6时、所有读数都是垃圾。 我从未将这些直接连接到任何电压。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不知道答案。

    >我将声纳连接到 P4.7、它工作正常、但当我切换并连接4.1-4.6时、所有读数都是垃圾
    这些词语似乎表明、连接 P4.1-6会影响 P4.7的功能。 如果是、这可能是一个线索。

    P5/P6引脚(自昨天起)是否也出现故障?

    您能量化(或至少分类)"垃圾"吗? 卡在高/低/其他位置? 在14位范围内浮动? 在较小的范围内浮动? 如果您将一个连接到3.3V 或 GND 会怎么样?

    当您说"声纳"时、我想到的是 SR-04ish 超声波设备。 这是正确的吗? 您使用的是 Launchpad?

    在 main()的第二行设置一个断点,以确保您没有收到意外重置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Brandon、
    只有一个采样保持电路被复用到不同的通道上。 该电路在通道之间未放电或"擦除"、因此采样保持电容器上的任何电压都将是下一个通道的初始电压。 您可能希望从默认最小值增加采样保持时间、以查看这是否有用。

    在仅使用一个通道的工作示例中、是否也使用窗口比较器? 我不记得窗口比较器是否保存了结果内容。

    此致、
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Brandon、
    增加采样保持窗口是否会产生任何影响? 您能否验证窗口比较器是否用于单通道情况(哪种情况有效)?

    谢谢、
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、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、
    在该示例中、采样保持时间似乎是一个 ACLK 周期(32kHz)或30us。 您可以通过减小 compareConfig 结构中的值来延长此时间。 目前、由于它等于 upModeConfig、因此您只获得1个周期、即回滚到0 (请参阅 TRM 中的 timerA 说明)。 在原始代码中、采样保持时间仅为160nS、由 ADC 内部采样计时器决定、该计时器已启用但未配置、因此默认值为4个时钟、 您似乎没有初始化 ADC 时钟源(已注释掉)、因此默认时钟源是25MHz 的 MODCLK。 我会进行双次检查、但我认为这也意味着您在100Ksps 范围内的某个位置进行采样、其中示例为2Sps。

    此致、
    Chris

    www.ti.com/.../slau356h.pdf
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    作为 Chris 建议的替代方案、只需添加以下行:

    > MAP_ADC14_enableSampleTimer (ADC_AUTOMODIFY_DIOTIVation);//设置 SHP

    (我怀疑您只是忘记了它、但 Chris 解释了为什么它很重要。)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、我一直在查看示例代码以尝试弄清这一点。 我用 upModeConfig 中的周期和 compareConfig 中的比较值来查看更改。 如果您能向我解释一下数学、可能会更有意义。 我是参照 PWM 的工作原理来考虑它的:使用示例48[MHz]的时钟源、即20.82[ns]、使用一个4、800的周期、使其成为.1[ms]、即10k [Hz]、然后在这里、我可以根据.1[ms]节拍选择占空比。 upModeConfig 和 compareConfig 的工作方式是否相似? 我想时钟源是否为 ACLK = 32[kHz]、周期是否为16、000、得出.5[s]、但比较值与任何东西到底有什么关系? 这些数字中的哪一个准确地使每秒的采样次数为1。 我没有使用16、000、而是使用160作为周期、使用160作为比较值、并获得更快的采样率。 我只想了解它到底是如何工作的。 在使用示例代码时、我能够使1个声纳传感器正常工作、但一旦我插入另一个传感器(即使没有代码或任何代码)、它将开始使我的电流传感器读数变得混乱。 我认为这与你在12月28日提到的事情有关。 然后、我查看了我的传感器、它们具有一个链接功能、其中一个传感器将读取、然后一旦读取完成、它将触发下一个传感器在循环中读取、依此类推。 一旦我对它们进行了相应的接线、这似乎是正常的。 回到我的原始代码、我已经有了 MAP_ADC14_enableSampleTimer (ADC_AUTOMATIC _ITERACE);在 Bruce 先生提到的代码中、使用新的接线、这对于我的两个传感器都很适用、因此我认为我的问题是单个采样保持电路。 现在、我的问题是、我是否需要担心设置 Timer_A 来指定采样率、或者我是否应该坚持 ADC_AUTOMATIC 迭代、即使我计划总共使用7个传感器 (因为我正在执行链、所以它们将是相对较大的延迟、因为所有传感器的一次完整读取将需要1个传感器的读取 x7的时间)? 如果是、如何在原始代码上设置该代码、我复制了该示例使用的所有必要代码、并且添加了该代码后传感器无法读取该代码、 我不确定是否需要执行任何额外操作、因为我正在执行 ADC14_configureMultiSequenceMode 或因为我没有执行自动迭代。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    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。

    e2e.ti.com/.../adc14_5F00_multiple_5F00_channel_5F00_repeat_5F00_timera_5F00_source_5F00_forum_5F00_02.c

    此致、

    Chris