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.
工具/软件:TI-RTOS
大家好、
我正在研究一个应用、其中一个任务需要生成频率范围为0.25Hz 至25Hz (周期值范围为40至4000毫秒)的 PWM 信号。
以下是我的配置
1) 1) PWM 硬件属性代码片段:
CONST PWMTiva_HWAttrs pwmTivaHWAttrs[EK_TM4C1294XL_PWMCOUNT]={
{
baseAddr = PWM0_BASE、
pwmOutput = PWM_OUT_0、
pwmGenOpts = PWM_GEN_MODE_DOWN | PWM_GEN_MODE_DBG_RUN
}、
{
baseAddr = PWM0_BASE、
.pwmOutput = PWM_OUT_1、
pwmGenOpts = PWM_GEN_MODE_DOWN | PWM_GEN_MODE_DBG_RUN
}、
{
baseAddr = PWM0_BASE、
pwmOutput = PWM_OUT_2、
pwmGenOpts = PWM_GEN_MODE_DOWN | PWM_GEN_MODE_DBG_RUN
}、
};
CONST PWM_Config PWM_CONFIG[]={
{
fxnTablePtr =&PWMTiva_fxnTable、
.object =&pwmTivaObjects[0]、
hwAttrs =&pwmTivaHWAttrs[0]
}、
{
fxnTablePtr =&PWMTiva_fxnTable、
.object =&pwmTivaObjects[1]、
hwAttrs =&pwmTivaHWAttrs[1]
}、
{
fxnTablePtr =&PWMTiva_fxnTable、
.object =&pwmTivaObjects[2]、
hwAttrs =&pwmTivaHWAttrs[2]
}、
{NULL、NULL、NULL}
};
2) 2) PWM 引脚复用和 GPIO 配置
void EK_TM4C1294XL_initPWM (void)
{
/*启用 PWM 模块0 */
SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);
GPIOPinConfigure (GPIO_PF0_M0PWM0);
GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_0);
GPIOPinConfigure (GPIO_PF1_M0PWM1);
GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_1);
GPIOPinConfigure (GPIO_PF2_M0PWM2);
GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_2);
PWM_init();
}
3) 3) EK_TM4C1294XL.h 枚举更新为三个 PWM 输出。
typedef 枚举 EK_TM4C1294XL_PWMName{
EK_TM4C1294XL_PWM0 = 0、
EK_TM4C1294XL_PWM1、
EK_TM4C1294XL_PWM2、
EK_TM4C1294XL_PWMCOUNT //= 3
}EK_TM4C1294XL_PWMName;
4) 4) PWM 配置参数
已尝试以下两种模式:
1) PWM 占空比模式:PWM_Duty_Time:以微秒为单位分配的周期和占空比值。
2) 2) PWM 占空比模式:PWM_Duty_scalar:计算:
Duty_cycle_percentage =((ON_TIME * 1000)/(ON_TIME + OFF_TIME)* 1000)* 100
Duty_cycle_scalar =(65535 * Duty_cycle_percentage)/ 100
PWM_setDuty (pwmHandle、Duty_cycle_scalar);
问题:周期值范围为40到68毫秒(频率为25Hz 到14.705Hz)、我能够生成 PWM 信号。 但是、当我尝试使用等于70毫秒及以上(频率14.28Hz 及以下)的周期值时、PWM 信号线变为高电平、之后没有变化。
我想知道、PWM 模块能否生成此低频信号? 如果是、我需要在 TI-RTOS 项目中执行哪些配置来实现这种低频。
和 PWM 信号、占空比为20毫秒、DSO 将值显示为10ms 占空比。 我不确定为什么会发生这种情况。
我们衷心感谢您的帮助。 提前感谢。
您好!
您需要检查几件事情。
-我假设您在打开 PWM 驱动程序实例之前设置 PMW_DUTY 标量。 是这样吗? 默认值为 PWM_Duty_Time。 打开驱动程序实例后,更改操作模式的唯一方法是关闭并使用新模式重新打开该实例。 请参阅以下用户指南。
该模式由 PWM_Params 数据结构中的 PWM_DutyMode 字段确定。 。
该域的 PWM_Params 默认为 PWM_Duty_Time 模式。 打开后、唯一的更改方法
工作模式是使用新模式关闭并重新打开 PWM 实例。
-您能否在寄存器浏览器窗口中检查 PWMCC 寄存器并检查您具有的 PWM 时钟分频器? PWM 模块基于16位计数器。 最快的 PWM 时钟可以是120MHz、等于系统时钟。 如果您的 PWM 时钟等于系统时钟(PWM 时钟由系统时钟1分频)、那么您可以拥有的最大周期为8.3ns * 65535 = 0.544ms。 如果将 PWM 时钟除以系统时钟的64、则可以得到的最大周期为34ms。
您好!
感谢您提供如此快速的响应。 是的、我在打开 PWM 实例之前设置 PWM 占空比模式。 请找到以下代码:
PWM_Params PWM_params;
PWM_Handle pwm1;
PWM_PARAMS_INIT (&PWM_params);
PWM_params.dutyMode = PWM_Duty_Scalar;
PWM_params.period =(ton + toff)* 1000;//以微秒为单位的周期
pwm1 = PWM_OPEN (Board_PWM1、&PWM_params);
if (pwm1 = NULL){
System_abort ("Board_PWM1 did not open");
}
Duty_cycle_percentage =((ton * 1000)/PWM_params.period)* 100;
Duty_cycle =(65535 * Duty_cycle_percentage)/ 100;
PWM_setDuty (pwm1、Duty_cycle);
在寄存器浏览器窗口中、我发现 PWMCC 寄存器的值为0x00000005、这表示 PWM 时钟被64分频、这就是我能够输入最大周期34ms 的原因。
如何更改该寄存器值、将时钟分频值设为1、将频率设为0.544ms?
大家好、
我使用 PWMClockSet()来更改 PWM 时钟配置。 但它没有影响。 您能告诉我在哪里添加这一行代码吗?
我尝试执行以下操作:
1) 1) PWM 模块被配置为生成 PWM 信号的任务内部。 在这里,我在创建 PWM 句柄之前调用了 API PWMClockSet()。 :这没有影响。
PWM_Handle pwm1;
PWMClockSet (PWM0_BASE、PWM_SYSCLK_DIV_1);
PWM_Params PWM_params;
PWM_PARAMS_INIT (&PWM_params);
PWM_params.dutyMode = PWM_Duty_Scalar;
PWM_params.period = 200;
pwm1 = PWM_OPEN (Board_PWM1、&PWM_params);
if (pwm1 = NULL){
System_abort ("Board_PWM1 did not open");
}
2)在文件 EK_TM4C1294XL.c 中、如下所示:
void EK_TM4C1294XL_initPWM (void)
{
/*启用 PWM 模块0 */
SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);
PWMClockSet (PWM0_BASE、PWM_SYSCLK_DIV_1);
GPIOPinConfigure (GPIO_PF0_M0PWM0);
GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_0);
GPIOPinConfigure (GPIO_PF1_M0PWM1);
GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_1);
GPIOPinConfigure (GPIO_PF2_M0PWM2);
GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_2);
PWM_init();
}
在这两种情况下、我都无法生成34ms 以上的 PWM 信号。 请提供一些建议。
您好!
我已将您的问题转交给我们的 TI-RTOS 专家。
您好!
您能否在 PWM_open()之后尝试调用 PWMClockSet()?
您好、Charles、
感谢您的回答。 但仍然没有改善。 每当我给出大于34ms 的值时、就像导通时间/占空比一样。 它不工作。
我有一个观察结果、如果这有助于找到导致这种情况的根本原因、只要我导通时间为34ms、关断时间为34ms (占空比为50%、周期值为68ms (params.period= 68000))。 生成 PWM 信号。 但在 DSO 中、我看到导通时间和关断时间是输入值的一半。
请为我们提供指导。
您好!
您能否澄清一下,插入 PWMClockSet()后,根本没有效果,或者行为发生了一些变化,但行为不正确?
当您查看 PWMCC 寄存器时、您是否看到了新的变化?
您好!
稍等。 在我之前的答复中、我说过、使用 PWM 时钟除以系统时钟的64、由于16位计数器宽度、您将获得34mS 的最长周期。 在120MHz 时、系统时钟周期为8.3ns。 如果 PWM 时钟被64分频、则 PWM 时钟周期为531ns。 531ns * 2^16 = 34.8ms。 这意味着在50/50占空比 PWM 下、您只能获得大约17.4ms 的导通时间和17.4ms 的关断时间。
您可能希望探索如何在 MCU 中使用 GPTM 模块。 MCU 中的 GPTM 模块也可以在 PWM 模式下运行、它可以为您提供高达24位的精度。 另一种解决方案是降低系统时钟频率。 如果您以60MHz 或更慢的频率运行、则它将为您提供所需的最大周期、但以较慢的系统时钟运行也会降低您的器件性能。 这将是您的折衷方案。
您是否必须在应用中使用 RTOS?
您好!
正如您所建议的那样,我在 PWM_open()之后使用了 PWMClockSet() API。 编译和闪存后、我检查了寄存器值、它为0x0。
配置三个 PWM 输出(PWM_OUT_0、PWM_OUT_1和 PWM_OUT_2)。 现在我观察到、每当我以微秒为单位写入周期值(该值大于34ms)时、我会得到类似的结果(对于 Board_PWM1、它显示"无法打开 Board_PWM1"):
无法打开 Board_PWM。 当前占空比为32767
FSR = 0x0000
HFSR = 0x40000000
DFSR = 0x0000000b
MMAR = 0xe000ed34
BFAR = 0xe000ed38
AFSR = 0x00000000
正在终止执行..
我再尝试一次、即尝试在 EK_TM4C1294XL.h 文件中将 PWM 输出从 PWM_OUT_1更改为 PWM_OUT_2、并将 PWM_OUT_3更改为 PWM_OUT_4。 请在下面查找代码片段。 执行此操作后、程序不会终止、但信号始终处于高电平。
CONST PWMTiva_HWAttrs pwmTivaHWAttrs[EK_TM4C1294XL_PWMCOUNT]={
{
baseAddr = PWM0_BASE、
pwmOutput = PWM_OUT_0、
pwmGenOpts = PWM_GEN_MODE_DOWN | PWM_GEN_MODE_DBG_RUN
}、
{
baseAddr = PWM0_BASE、
pwmOutput = PWM_OUT_2、
pwmGenOpts = PWM_GEN_MODE_DOWN | PWM_GEN_MODE_DBG_RUN
}、
{
baseAddr = PWM0_BASE、
pwmOutput = PWM_OUT_4、
pwmGenOpts = PWM_GEN_MODE_DOWN | PWM_GEN_MODE_DBG_RUN
}、
};
是的、我们的主要要求是使用 TI-RTOS。 好的、如果这会产生积极的结果、我们可以使用 GPTM 模块。 但在 TI-RTOS 用户指南中看不到任何与 GPTM 模块相关的信息/API。 您能建议我在哪里找到它吗?
您还能解释一下、在 PWM_Duty_scalar 模式下、周期和占空比的值是多少? 例如:我的导通时间为20ms、关断时间为20ms。 因此周期值变为40ms。 基于我正在提供周期参数 A 值:
PWM_params.period = period =(ON_TIME + OFF_TIME)* 1000;// as period is in microseconds。
使用以下公式计算 Duty_cycle:
浮点 Duty_cycle_percentage;
int32_t CURRENT_DUTY 周期;
Duty_cycle_percentage = ON_TIME * 1000;
Duty_cycle_percentage = Duty_cycle_percentage /((ON_TIME + OFF_TIME)* 1000);
Current_Duty_cycle = Duty_cycle_percentage * 100;
Current_Duty_cycle =(Current_Duty_cycle * 65535)/ 100;
我在这里是否有任何问题、或者是否有更好的方法来计算这些值? 在示波器中、对于20ms 的导通时间和20ms 的关断时间、我认为频率为50Hz、但它应该是25Hz、对吧?
您好!
我很高兴你能为我们提供支持。 您能否向我解释一下、在 PWM_Duty_scalar 模式下、周期和占空比的值是多少? 例如:我的导通时间为20ms、关断时间为20ms。 因此周期值变为40ms。 基于我正在提供周期参数 A 值:
PWM_params.period = period =(ON_TIME + OFF_TIME)* 1000;// as period is in microseconds。
使用以下公式计算 Duty_cycle:
浮点 Duty_cycle_percentage;
int32_t CURRENT_DUTY 周期;
Duty_cycle_percentage = ON_TIME * 1000;
Duty_cycle_percentage = Duty_cycle_percentage /((ON_TIME + OFF_TIME)* 1000);
Current_Duty_cycle = Duty_cycle_percentage * 100;
Current_Duty_cycle =(Current_Duty_cycle * 65535)/ 100;
我在这里是否有任何问题、或者是否有更好的方法来计算这些值? 在示波器中、对于20ms 的导通时间和20ms 的关断时间、我认为频率为50Hz、但它应该是25Hz、对吧?
您好、Nishitha、
您是否有机会阅读我的上次答复? 正如我解释过的、最大周期受16位计数器 PWM 模块的限制。 最大周期将约为35mS (或更精确地说为34.952ms)、等于28.57Hz。 您不能低于该值。 因此、25Hz 是无法实现的。 当您指定40ms 作为周期时、您会溢出16位计数器能够支持的值。 一些不正确的预加载值被加载到 PWM0_LOAD 寄存器中。 在寄存器窗口中检查寄存器、您将知道我的意思。
下面是我刚才做的一个实验。 我将 PWM 配置为具有 34.952ms 的最大周期。
void pwmLEDFxn (UARg arg0、UARg arg1) { PWM_Handle pwm1; PWM_PARAMS 参数; uint16_t pwmPeriod = 34952; //一个16位计数器可以支持的最大 PWM 周期为34.952ms uint16_t Duty = 32768; // 32768是65535的50% PWM_PARAMS_INIT (params); params.period = pwmPeriod; params.dutyMode = PWM_Duty_scalar; pwm1 = PWM_OPEN (Board_PWM0、params); if (pwm1 = NULL){ System_abort ("Board_PWM0未打开"); } /*循环永远递增 PWM 占空比*/ while (1){ PWM_setDuty (pwm1、占空比); Task_sleep ((UINT) arg0); } }
查看 PWM_0_LOAD 寄存器、加载的值为0xFFFE、接近于16位寄存器可以保存的最大值。 查看确定占空比为周期一半的 PWM_0_CMPA。
您好、Charles、
感谢您的讲解。 这是合理的、即使我在加载寄存器中观察到0x0000FFFF 也是如此。
正如您建议使用 GPTM 模块的那样、我如何使其正常工作? 我在 TI RTOS 用户指南中找不到任何 API? 请就此向我提出建议。
如果您有任何其他解决方法、请告诉我。
您好!
TI-RTOS 没有用于支持在 PWM 模式下运行的计时器模块的 API。 您将需要使用 TivaWare 来完成。 首先、请参阅数据表、了解 GPTM 模块的工作原理和在 PWM 模式下工作的能力。 然后、您可以参考 TivaWare 示例 /examples/peripherals/timer/pwm.c. 在将代码迁移到 TI-RTOS 之前、请按原样运行示例以了解它。 还请注意、BIOS 从硬件中借用两个计时器来管理 BIOS 系统时钟和时间戳提供商。 通常、它使用系统中的前两个计时器。 如果您仍然想将 TI-RTOS 提供的驱动程序用于 PWM、那么我建议的最佳方法是降低系统时钟的速度。 例如、如果您将系统时钟配置为60MHz、则可以使用16位 PWM 模块获得所需的40ms 周期。
我还稍微修改了该示例、以接近40ms 的 PWM 周期。
// // // pwm.c -在16位 CCP 上演示基于定时器的 PWM 的示例。 // //版权所有(c) 2010-2017 Texas Instruments Incorporated。 保留所有权利。 //软件许可协议 // 以源代码和二进制形式重新分发和使用,无论是否 进行//修改,只要 满足以下条件//: // 重新分发源代码必须保留上述版权 //声明、此条件列表和以下免责声明。 // //二进制形式的再发行必须复制上述版权 //声明、此条件列表和// 分发随附的//文档和/或其他材料中的以下免责声明。 //// 未经 事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。 //// 本软件由版权所有者和贡献者提供 //“按原样”,不 承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权 //所有者或贡献者都不对任何直接、间接、偶然、 //特殊、模范、 或相应的损害(包括但不 限于采购替代产品或服务;丧失使用、 //数据或利润; 或业务中断)、无论 出于何种原因使用 本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。 // //这是 Tiva 固件开发包的修订版2.1.4.178的一部分。 //// ***************** #include #include #include "inc/hw_gpio.h" #include "include/hw_ints.h" #include "inc/hw_memmap.h" #include "inc/hw_timer.h" #include "inc/hw_types.h" #include "driverlib/gpio.h" #include "driverlib/interrupt.h"#include "driverlib/driver.h"#include"#driverlib/driverlib.idio.try" #include "driverlib/driver.h"#driverlib/driverlib.ide"#include "driver.h" // //! addtogroup timer_examples_list //!使用计时器的 PWM (PWM)
//! //! 此示例展示了如何配置 Timer1B 在 //! 定时器的 CCP 管脚。 //! //! 此示例使用以下外设和 I/O 信号。 您必须 //! 查看这些内容并根据您自己的董事会需要进行更改: //! - Timer1外设 //! - GPIO 端口 B 外设(用于 T1CCP1引脚) //! - T1CCP1 - PB5 //! //! 以下 UART 信号仅配置为显示控制台 //! 消息。 操作 //! 定时器0。 //! - UART0外设 //! - GPIO 端口 A 外设(用于 UART0引脚) //! - UART0RX - PA0 //! - UART0TX - PA1 //! //! 此示例使用以下中断处理程序。 要使用此示例 //! 在您自己的应用程序中、您必须将这些中断处理程序添加到 您的//! 矢量表。 //! -无。 //// ***************** // // // g_ui32SysClock 包含系统时钟频率 // //********* #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) uint32_t g_ui32SysClock; #endif //********* // //此函数将 UART0设置为用于控制台,以便 在示例运行时显示信息//。 //// ***************** void InitConsole (void) { // //启用用于 UART0引脚的 GPIO 端口 A。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); // //为端口 A0和 A1上的 UART0功能配置引脚复用。 //如果您的器件不支持引脚复用、则无需执行此步骤。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinConfigure (GPIO_PA0_U0RX); GPIOPinConfigure (GPIO_PA1_U0TX); // //启用 UART0以便我们可以配置时钟。 // SysCtlPeripheralEnable (SYSCTL_Periph_UART0); // //使用内部16MHz 振荡器作为 UART 时钟源。 // UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC); // //为这些引脚选择替代(UART)功能。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); // //初始化控制台 I/O 的 UART // UARTStdioConfig (0、115200、16000000); } //********* // //打印出5个“”。 每次打印后出现第二次延迟。 此函数将 //然后退格,清除先前打印的点,再退格,以便 //在同一行上连续打印输出。 //// ***************** void PrintRunningDots (void) { UARTprintf ("。 "); #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) SysCtlDelay (g_ui32SysClock / 3); #else SysCtlDelay (SysCtlClockGet ()/3); #endif UARTprintf ("。 "); #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) SysCtlDelay (g_ui32SysClock / 3); #else SysCtlDelay (SysCtlClockGet ()/3); #endif UARTprintf ("。 "); #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) SysCtlDelay (g_ui32SysClock / 3); #else SysCtlDelay (SysCtlClockGet ()/3); #endif UARTprintf ("。 "); #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) SysCtlDelay (g_ui32SysClock / 3); #else SysCtlDelay (SysCtlClockGet ()/3); #endif UARTprintf ("。 "); #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) SysCtlDelay (g_ui32SysClock / 3); #else SysCtlDelay (SysCtlClockGet ()/3); #endif UARTprintf ("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); UARTprintf (" "); UARTprintf ("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); #if defined (target_is_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) SysCtlDelay (g_ui32SysClock / 3); #else SysCtlDelay (SysCtlClockGet ()/ 3); #endif } //************* // //将 Timer1B 配置为占空比为66%的16位 PWM。 //// ***************** int main (void) { // //将时钟设置为直接从外部晶振/振荡器运行。 // TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值 板上的//晶体。 // #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) G_ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000); #else SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz); #endif // //必须启用 Timer1外设才能使用。 // SysCtlPeripheralEnable (SYSCTL_Periph_Timer1); // //对于此示例、T1CCP1与端口 D 引脚3一起使用。 //您使用的实际端口和引脚可能有所不同,请参阅 //数据表以了解更多信息。 // GPIO 端口 B 需要启用、以便可以使用这些引脚。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD); // //为定时器/CCCP 功能配置 GPIO 管脚复用。 //只有当您的器件支持 GPIO 引脚功能多路复用时才需要此功能。 //研究数据表以查看每个引脚分配的函数。 // TODO:更改此选项以选择您正在使用的端口/引脚 // GPIOPinConfigure (GPIO_PD3_T1CCP1); // //设置用于显示消息的串行控制台。 这是 //仅针对此示例程序,计时器/PWM 操作不需要。 // InitConsole(); // //为 CCP 管脚配置 ccp 设置。 该函数也会提供 将这些引脚的//控制到 SSI 硬件。 请参阅中的数据表 //查看每个引脚分配的函数。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeTimer (GPIO_PORTD_base、GPIO_PIN_3); // //在控制台上显示示例设置。 // UARTprintf ("16位计时器 PWM ->); UARTprintf ("\n 计时器= Timer1B"); UARTprintf ("\n 模式= PWM"); UARTprintf ("\n 占空比= 50%\n"); UARTprintf ("\n 在 CCP3 (PD3)上生成 PWM ->"); //配置计时器以将 PIOSC=16MHz 作为源时钟 // // TimerClockSourceSet (Timer1_base、timer_clock_PIOSC); // //将 Timer1B 配置为16位周期定时器。 // TimerConfigure (Timer1_base、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_B_PWM); //将 Timer1B 预加载设置为/10 TimerPrescaleSet (Timer1_base、timer_B、0x49); // //将 Timer1B 加载值设置为0x3E00。 // TimerLoadSet (Timer1_base、timer_B、0x3E00); // //将 Timer1B 匹配值设置为装载值/2。 TimerPrescaleMatchSet (Timer1_base、Timer_B、 TimerPrescaleGet (Timer1_base、timer_B)/ 2); // TimerMatchSet (Timer1_base、Timer_B、 TimerLoadGet (Timer1_base、timer_B)/ 2); // //启用 Timer1B。 // TimerEnable (Timer1_base、timer_B); // //在 Timer1B PWM 运行时永久循环。 // while (1) { // //控制台上显示程序正在运行的打印输出指示。 // PrintRunningDots(); } }
您好、Charles、
感谢解决方案、我们一定会尝试这一点。
谢谢、
Nischitha