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

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

器件型号:MSP432P401R

因此、我有用于为电机创建2个 PWM 输出的代码、然后我有用于3个(将是7个) ADC 引脚的代码、这些引脚用于声纳传感器。 我已经为 ADC 设置了用于中断的比较器。 仅当我测试这些时、它们就能正常工作... PWM 可以通过按钮中断进行更改、然后运行电机。 ADC 引脚显示值并相应地通过 ISR 中断以点亮 LED。 现在我尝试将这两者结合起来、我希望 ADC ISR 能够更改 PWM 占空比并输出新值、 但是、当我测试代码时、ADC ISR 对 PWM 完全没有影响、它会更改我可以通过 CCS 界面上的"Expressions"看到的占空比值、 但物理输出不会改变、我想知道我为什么需要做什么。 以下是我的代码:  

/* DriverLib 包括*/
#include 

/*标准包括*/
#include 
#include 

/* for usleep()*//#include

//#include 

/* TI-RTOS 头文件*/
#include 
//#include 

/*电路板头文件*/
//#include "Board.h"

//*静态*/
uint16_t resultsBuffer[3];//缓冲器以保存每个声纳传感器的 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);

volatile uint32_t ii;

/******** 右侧电机的 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、
4200//启动时占空比为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、
4200
};

/********* 两个电机的结束定时器_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)
{
//SonarThree();//当物体在1-2英尺之间时,右侧绿灯亮起。
MAP_PCM_gotoLPM0 ();//sleep while no interrupts are ocrupting.
}
}//end main
/********* 结束 main******** /

/********* 启动 sonars ******** /
void SonarOne (void){//P5.2 & resultsBuffer[0]
MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN0);//LED1 (左侧)红色
MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN1);
MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN0);

pwmConfigL.dutyCycle = 0;
pwmConfigR.dutyCycle = 0;

}
void SonarTwo (void){//P5.1 & resultsBuffer[1]
MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN0);//LED2 (右侧)红色
MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN0);
MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN1);
pwmConfigL.dutyCycle = 4800;
pwmConfigR.dutyCycle = 4800;

}
void SonarThree (void){//P5.0 & resultsBuffer[2]
MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN1);//LED2 (右侧)绿色
MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN0);
MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN0);
// pwmConfigL.dutyCycle = 4800;
// pwmConfigR.dutyCycle = 4800;
// map_Timer_A_generatePWM (timer_A0_BASE、&pwmConfigL);
// map_Timer_A generatePWM (timer_pwmConfigL)
;// map_r_generatePWM (timer_pw_r_pw_r_generateA0)
void SonarFour (void){//P4.7 & FODSBuffer[3]
}
void SonarFive (void){//P4.0 & resultsBuffer[4]
}
void SonarSix (void){//P6.1 & resultsBuffer[5]
}
void SonarSeven (void){/P6.0 & resultsBuffer[6]
}
结束语音音标 /

/********* 启动 ADC 处理程序******** //
//*只要 Sonar Reading 是比较器所说的内容并且 MAP_ADC14_enableInterrupt (X)所说的内容,就会触发此中断。 */
void ADC14_IRQHandler (void)
{
uint64_t status;

STATUS = MAP_ADC14_getEncableInterruptStatus ();//获取中断状态以进行比较
MAP_ADC14_clearInterruptFlag (status);//清除中断标志以进行下一次中断检查

resultsBuffer[0]= MAP_ADC14_getResult (ADC_MEM0);//P5.0
resultsBuffer[1]= MAP_ADC14_getResult (ADC_MEM1);//P5.1
resultsBuffer[2]= MAP_ADC14_getResult (ADC_MEM2);//P4.7

如果((resultsBuffer[0]< 1000)){//LED 1 on when objects are close (红色)(对象关闭时亮起)
SonarOne();//当物体接近1英尺
时,红色灯亮起。}
否则 if ((resultsBuffer[1]< 1000)){
SonarTwo ();//物体超过2英尺时,右侧红色灯亮起。
}
否则{
SonarThree();//当物体在1-2英尺之间时,右侧绿色灯亮起
。}

MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfigL);
MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfigR);
}//结束 ADC14_IRQHandler
/********* 结束 ADC 处理程序******** /

/********* 启动端口1处理程序******** /
/* Port1 ISR -此 ISR 将逐步升高 PWM 的占空比
*在按钮上按*/
void Port1_IRQHandler (void)
{
uint32_t status = MAP_GPIO_getenabledInterruptStatus (GPIO_PORT_P1);//P1.1 (S1)
MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、状态);

/* Imagine 状态获得所有端口1中断状态、因此如果引脚1有中断
*状态将为00000010、对于引脚4、它将为00010000、因此如果我们使用状态
*引脚1或引脚4、如果这些中断位为高电平、则该位将为 true、并且为 if
*语句将运行。*/

IF (STATUS & GPIO_PIN1)//P1.1 (S1)
{//将电机占空比向前移动(增加它)
if (pwmConfigL.dutyCycle = 4800 && pwmConfigR.dutyCycle = 4800){
pwmConfigL.dutyCycle = 4800;
pwmConfigR.dutyCycle = 4800;}
否则{
pwmConfigL.dutyCycle += 300;
pwmConfigR.dutyCycle += 300;}

MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfigL);
MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfigR);
}
else //(status & GPIO_PIN4)//P1.4 (S2)
{//向后移动电机占空比(减小它)
if (pwmConfigL.dutyCycle = 2400 && pwmConfigR.dutyCycle = 2400){
pwmConfigL.dutyCycle = 2400;
pwmConfigR.dutyCycle = 2400;}
否则{
pwmConfigL.dutyCycle -= 300;
pwmConfigR.dutyCycle -= 300;}

MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfigL);
MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfigR);
}
}//end Port1_IRQHandler
/***** 结束端口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_setAsInputPinWithPullUpResistor (GPIO_PORT_P1、GPIO_PIN4);//设置端口1上的引脚4
MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、GPIO_PIN1);
MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、GPIO_PIN4);
MAP_GPIO_enableInterrupt (GPIO_PORT_P1、GPIO_PIN1);
MAP_GPIO_enableInterrupt (GPIO_PORT_P1、GPIO_PIN4);

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);
}//结束 PWMConfigure
/********* 结束 PWM 配置'******** /

/********* 启动 ADC 配置******** /
void ADCConfigure(){

/*设置时钟
* 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);

/*在端口4引脚0和7上配置 GPIO 以实现第三功能和输入、
*端口5引脚0、1和2以及端口6引脚0和1 *
MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P5、GPIO_PIN0 | GPIO_PIN1、GPIO_TIVE_MODULE_Function);
MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P4、GPIO_PIN7、GPIO_TIVE_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_PIN0);
MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN0);//LED2 (右侧和蓝色)
MAP_GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN2);
MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN2);//LED2 (右侧和红色)

/* DLUG 部分:2.6.2.3 |配置 ADC 存储器(ADC_MEM0 - ADC_MEM6 (A6 - A12)、不再重复)
*使用内部3.3[V]基准*/
MAP_ADC14_configureMultiSequenceMode (ADC_MEM0、ADC_MEM2、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_A5、false);//ADC5 = P5.0 = MEM0
MAP_ADC14_configureConversionMemory (ADC_MEM1、
ADC_VREFPOS_AVCC_VREFNEG_VSS、ADC_INPUT_A4、false);//ADC4 = P5.1 = MEM1
MAP_ADC14_configureConversionMemory (ADC_MEM2、
ADC_VREFPOS_AVCC_VREFNEG_VSS、ADC_INPUT_A6、false);//ADC6 = P4.7 = MEM2

/* DLUG 部分:2.6.2.16 |将采样定时器设置为自动单步执行序列转换
*一个采样/转换完成后,ADC 模块将自动继续到下一个采样。*/
MAP_ADC14_enableSampleTimer (ADC_AUTOMATE_DIOTIVation);


/*DLUG 部分:2.6.2.11 |启用指定的内存通道掩码以使用指定的比较器窗口。 。
ADCC 模块有两个不同的比较器窗口、可通过此功能进行设置。*/
ADC14_enableComparatorWindow (ADC_MEM0 | ADC_MEM2、
ADC_COMP_WINDOW0);
ADC14_enableComparatorWindow (ADC_MEM1、
ADC_COMP_WINDOW1);

/* DLUG 部分:2.6.2.26 |设置指定窗口比较器的下限和上限。
*(窗口0或窗口1、下限、上限)*/
ADC14_setComparatorWindowValue (ADC_COMP_WINDOW0、600、2000);

/* DLUG 部分:2.6.2.13 |当通道降至比较器阈值以下时启用中断、
*如果使用 ADC_HI_INT 在通道高于比较器或的阈值时启用中断
*当通道处于超薄阈值时、ADC_IN_INT 启用中断通道*
MAP_ADC14_enableInterrupt (ADC_LO_INT);

ADC14_setComparatorWindowValue (ADC_COMP_WINDOW1、1500、2000);

MAP_ADC14_enableInterrupt (ADC_LO_INT);

/* DLUG 部分:12.4.2.4 - 12.4.2.5 |启用中断*/
MAP_Interrupt_enableInterrupt (INT_ADC14);
INTERRUPT_setPriority (INT_ADC14、1);
MAP_Interrupt_enableMaster();

/* DLUG 部分:2.6.2.12和2.6.2.32|启用 ADC 数据转换。 触发采样开始。
*通过切换触发软件位来切换 ADC 模块转换的触发器。*/
MAP_ADC14_enableConversion();
MAP_ADC14_toggleConversionTrigger ();
}//end ADCConfigure
/********* 结束 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 ();
}//end InitDCO
/***** 结束 DCO 初始化代码 / 

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

    您可以确保执行 ADC ISR、并执行以下函数

    MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfigL);
    MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfigR);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Brandon、
    在您提供的代码中、ADC ISR 在调用 API 应用配置之前不执行任何操作来更新 PWM 配置。 请将端口 ISR 与 ADC ISR 进行比较。

    此外、在 InitDCO 中、您将器件设置为48Mhz、然后使用 MCLK 为 ADC 供电。 这不是有效的组合。 请参阅器件数据表和技术参考手册。

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

    Chris、  

    谢谢。 我已经说过了,我想我没有评论,有一些原因。 现在发生的情况是、传感器将触发中断并相应地更改占空比、但物理 PWM 直到停止感应、才会发生变化。 例如、如果我将手放在第一个 ADC 前面、它将中断并更改占空比、但物理输出不会改变。 一旦我从传感器前面拔下手、它将更改物理 PWM 输出。 这是否也与频率有关、或者是否有我应该做的特定事情来确保 PWM 在中断内部重新配置?

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    > MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfigL);
    此函数最适合在开始时开始生成 PWM。 之后、您应该使用 Timer_A_setCompareValue 之类的内容来设置 CCR。

    此时:它会清除计数器(TACLR)、因此、如果您以足够快的速度(重复)调用它、计时器将没有时间运行。 在您的测试用例中、LO_INT 会非常快速地触发、直到您将手拿开、然后它不会触发、计时器可以运行。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Brandon、

    如果您能够解决您的问题、如果是、请将线程标记为已回答、否则请告知我们。
    如果没有其他活动、我将在接下来的3天内关闭此主题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    再次感谢 Bruce!

    我能够找到一个使用 CaptureCompare 生成2个 PWM 的示例、我只需在 ADC 中断中插入 Timer_A_setCompareValue、它就会随着传感器读数的变化而改变占空比!

    示例程序:TIMER_A_updown_COMPARE_MULTIL_PWM.c

    我有最后一个问题、然后您可以将其标记为已解决!

    在我以4800周期执行 PWM 之前、数字越高、PWM 在占空比的高电平部分上的时间就越长。

    使用该 setCompareValue、我的数字似乎越高、我的 PWM 在占空比的低电平部分上的时间就越长。

    例如、如果我执行以下操作:MAP_Timer_A_setCompareValue (timer_A0_BASE、timer_A_CAPTUREACMPARE 寄存器3、4800);

    我的 PWM 输出为0[V]、如果我执行0而不是4800、那么我将接收到我的最大 PWM 输出(大约2.9[V])。

    我是否有一种方法可以反转这些代码的工作方式、以帮助简化我对代码的看法。

    /* DriverLib 包括*/
    #include 
    
    void InitDCO (void);//更改 DCO 的工作频率
    
    //应用定义*/
    #define TIMER_PERIOD 4800
    #define Duty_Cycl1 4200
    #define Duty_CYCLE2 4200
    
    // Timer_A UpDown Configuration 参数*/
    const Timer_A_UpDownModeConfig upDownConfig =
    {
    Timer_A_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源
    Timer_A_CLOCKSOURCE_divider _1、 //
    Timer_Period、 //
    Timer_A_TAIE_INTERRUPT_DISABLE、 //禁用计时器中断
    Timer_A_CCIE_CCR0_INTERRUPT_DISABLE、//禁用 CCR0中断
    Timer_A_do 清除 //清除值
    
    };
    
    // Timer_A 比较配置参数(PWM1)*/
    const Timer_A_CompareModeConfig compareConfig_PWM1 =
    {
    Timer_A_CAPTURECOMPARE 寄存器3、 //使用 CCR1
    Timer_A_CAPTURECMOLE_INTERRUPT_DISABLE、//禁用 CCR 中断
    Timer_A_OUTPUTMODE_TOGGLE_SET、 //切换输出但是
    Duty_Cyclle1 //
    };
    
    // Timer_A 比较配置参数(PWM2)*/
    const Timer_A_CompareModeConfig compareConfig_PWM2 =
    {
    Timer_A_CAPTURECOMPARE 寄存器4、 //使用 CCR2
    Timer_A_CAPTURECMOLE_INTERRUPT_DISABLE、//禁用 CCR 中断
    Timer_A_OUTPUTMODE_TOGGLE_SET、 //切换输出但是
    Duty_CYCLE2 //
    };
    
    int main (void)
    {
    /*停止 WDT */
    MAP_WDT_A_HOLDTimer();
    
    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 (左侧电机)
    
    /*将 Timer_A1配置为上行模式并启动*/
    MAP_Timer_A_configureUpDownMode (timer_A0_BASE、&upDownConfig);
    MAP_Timer_A_startCounter (TIMER_A0_BASE、TIMER_A_updown_MODE);
    
    /*初始化比较寄存器以生成 PWM1 */
    MAP_Timer_A_initCompare (timer_A0_BASE、&compareConfig_PWM1);
    
    /*初始化比较寄存器以生成 PWM2 */
    MAP_Timer_A_initCompare (timer_A0_BASE、&compareConfig_PWM2);
    
    /*不使用时睡眠*/
    while (1)
    {
    MAP_Timer_A_setCompareValue (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器_3、4800);//2.6 (S1)
    MAP_PCM_gotoLPM0 ();
    }
    }
    
    /********* 启动 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 ();
    }//end InitDCO
    /***** 结束 DCO 初始化代码 /
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    > Timer_A_OUTPUTMODE_TOGGLE_SET、 //切换输出但是
    您描述的内容类似于高电平有效(非反相) PWM。 我建议:
    > Timer_A_OUTPUTMODE_RESET_SET、 // OUTMOD=7:中间为0,开头为1
    因此、当您使用0%或100%时、您不会获得有趣的结果。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗯、似乎使用该方法仍然会导致"向后"占空比、并且还会将我的输出减少一半(我的最大输出为1.4[V]而不是2.8[V])。 我探讨了其他方案并发现了这一点

    > TIMER_A_OUTPUTMODE_TOGGLE_RESET、

    提供正确的占空比和振幅。 我注意到有一件事会与该捕获比较 PWM 相混淆。 我使用48[MHz]的时钟源并使用4、800个周期、我假设周期为之前的10[kHz]、但我的每个 PWM 都以5[kHz]的频率运行。 当我执行2、400个周期时、它们都以10[kHz]运行。 是否应该发生这种情况、因为我正在运行这两个计时器的同一个 Timer_A_UpDownModeConfig? 我是否应该通过自己的计时器设置来运行它们?

    感谢您的快速回答!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我没有注意到您已切换到向上/向下计数模式。 在该模式下、周期为2*CCR0、如 TRM (SLAU356H)图19-14所示。 与图19-12相比、您还可以看到一些模式的行为与向上计数模式稍有不同。

    您应该仔细查看这些波形并选择所需的波形。 还要考虑占空比为0%或100%时发生的情况(未显示)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    啊,是的! 我将反复使用 PWM 和 ADC、尝试弄清楚如何让它们使用计时器和捕捉比较! 我将其更改为"UpModeConfig"、一切正常、包括0和100%、均在10[kHz]下运行。 我想我可以通过这种方式使用 PWM 来实现我所需的一切!

    谢谢!