MSP432 定时器A PWM模式

MSP432P401R基础使用

六、定时器A PWM模式

(一)计数模式

  • 增计数模式

在这里插入图片描述

需要设置CCR0比较值寄存器0,CCR0确定定时器周期,可以将CCR0理解为STM32的ARR自动重装载值,定时器中断周期的计算公式也是通用的:Ttimer_a= C l k D i v × ( C C R 0 + 1 ) f   c l k   \quad {ClkDiv×(CCR0+1)\over f~clk~} f clk ClkDiv×(CCR0+1)【时钟分频乘以计数值(CCR0+1)的和除以时钟频率】

ClkDiv ∈ [1, 8] ∪ {10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 64 };
这里与STM32不同,是固定的

  • 增减计数模式
    在这里插入图片描述

从0开始计数到CCR0递减为0

(二)输出模式

在这里插入图片描述

​ 增计数模式 增减计数模式

定时器A有7种输出模式,但常用的只有两种

  • Output Mode 2:Toggle/Reset

    当计时器计数到TAxCCRn值时,输出切换。当计时器计数到TAxCCR0值时,它被重置

  • Output Mode 6:Toggle/Set

    当计时器计数到TAxCCRn值时,输出切换。当计时器计数到TAxCCR0值时设置

详见msp432p401r第791页

1.增计数模式:

在这里插入图片描述

定时器A从0计数到比较值1(CCR1)时,模式6输出高电平,之后比较值1计数到比较值0(CCR0)时,输出为低电平

比较值0是确定了整个定时器的周期

当选择输出模式2时,可以看到输出是相反的。

2.增减计数模式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6lhNXFcE-1688635667656)(D:\Typora\图片\image-20230705213922999.png)]

模式2和模式6配合后能生成带死区的互补PWM

一个定时器A能生成2路的带死区的互补PWM

(三)定时器A输出通道资源

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-792Yr89W-1688635667657)(D:\Typora\图片\image-20230705214540751.png)]

带有PM是支持端口重映射的意思

在这里插入图片描述

(四)库函数

  • 初始化定时器为PWM模式
Timer_A_generatePWM(TIMER_Ax_BASE, &TimAx_PWMConfig);
  • 改变比较值(占空比/周期)
Timer_A_setCompareValue(TIMER_Ax, COMPARE_REGISTER_x, CCR);

(五)一般配置步骤

  1. 配置时钟
  2. 配置GPIO复用
  3. 配置结构体
  4. 初始化定时器

(六)PWM驱动舵机

timA.h

#ifndef __RNA_TIMA_H
#define __RNA_TIMA_H
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>

void TimA1_PWM_Init(uint16_t ccr0, uint16_t psc);


#endif

timA.c

#include "timA.h"

void TimA1_PWM_Init(uint16_t ccr0, uint16_t psc)
{
    /*初始化引脚*/
    MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P7, GPIO_PIN7, GPIO_PRIMARY_MODULE_FUNCTION);

    Timer_A_PWMConfig TimA1_PWMConfig;
    /*定时器PWM初始化*/
    TimA1_PWMConfig.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;             //时钟源
    TimA1_PWMConfig.clockSourceDivider = psc;                            //时钟分频 范围1-64
    TimA1_PWMConfig.timerPeriod = ccr0;                                  //自动重装载值(ARR)
    TimA1_PWMConfig.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1; //通道一 (引脚定义)
    TimA1_PWMConfig.compareOutputMode = TIMER_A_OUTPUTMODE_TOGGLE_SET;   //输出模式
    TimA1_PWMConfig.dutyCycle = ccr0;                                    //这里是改变占空比的地方 默认100%

    MAP_Timer_A_generatePWM(TIMER_A1_BASE, &TimA1_PWMConfig); /* 初始化比较寄存器以产生 PWM1 */
}

main.c

#include "sysinit.h"
#include "usart.h"
#include "delay.h"
#include "timA.h"

/*
 * 定时器PWM周期:
 *`   
 * T_timer_a = CLKDIV * (CCR0 + 1) / f_clk
 *           = 48 * (19999 + 1) / 48000000
 *           = 0.02s = 50Hz
 */

#define CLKDIV 48     // 时钟源分频
#define CCR0 19999    // 比较值0
#define CCR1_MIN 499  // ( 499 + 1) / (19999 + 1) =  500 / 20000 =  2.5%
#define CCR1_MAX 2499 // (2499 + 1) / (19999 + 1) = 2500 / 20000 = 12.5%

int main(void)
{
    bool dir = 1;
    uint16_t i = CCR1_MIN;

    SysInit();    //第3讲 时钟配置
    delay_init(); //第4讲 滴答延时
	
    TimA1_PWM_Init(CCR0, CLKDIV); //第8讲 定时器A PWM
    while (1)
    {
        if (dir)
            i++;
        else
            i--;

        if (i == CCR1_MAX)
        {
            dir = 0;
            delay_ms(50);
        }
        else if (i == CCR1_MIN)
        {
            dir = 1;
            delay_ms(50);
        }
        MAP_Timer_A_setCompareValue(TIMER_A1_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_1, i);
        delay_us(600);
    }
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MSP432是一个基于ARM Cortex-M4内核的微控制器,它支持多种外设,其中包括PWM模块。要使用PWM模块中断,可以按照以下步骤进行设置: 1. 配置PWM模块:使用MSP432PWM模块之前,需要对其进行配置。可以使用MSP432的驱动库函数或者手动编写代码来进行配置。具体的配置包括选择PWM通道、设置PWM频率和占空比等。 2. 使能PWM模块中断:在PWM模块配置完成后,可以使能PWM模块中断。可以通过PWM模块的控制寄存器来设置中断使能位。 3. 编写PWM中断服务函数:一旦PWM模块中断被触发,MSP432会跳转到PWM中断服务函数中执行。在PWM中断服务函数中,可以编写处理中断的代码,例如读取PWM计数器的值或者修改PWM占空比等。 下面是一个简单的示例代码,演示如何在MSP432上实现PWM模块中断: ```c #include <ti/devices/msp432p4xx/driverlib/driverlib.h> #define PWM_FREQUENCY 1000 // PWM频率为1KHz void PWM_ISR(void) { // 处理PWM中断 } int main(void) { // 配置PWM模块 MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN4, GPIO_PRIMARY_MODULE_FUNCTION); MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig); // 使能PWM模块中断 MAP_Timer_A_enableInterrupt(TIMER_A0_BASE); MAP_Interrupt_enableInterrupt(INT_TA0_0); MAP_Interrupt_enableMaster(); // 设置PWM模块中断优先级 MAP_Interrupt_setPriority(INT_TA0_0, 0x40); while(1) { // 主循环 } } // PWM中断服务函数 void PWM_ISR(void) { MAP_Timer_A_clearCaptureCompareInterrupt(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_0); // 处理PWM中断 } ``` 在上述代码中,首先通过`MAP_Timer_A_generatePWM()`函数配置PWM模块,然后使用`MAP_Timer_A_enableInterrupt()`函数使能PWM模块中断。在`PWM_ISR()`函数中编写PWM中断服务函数的代码,在其中进行PWM中断处理。最后使用`MAP_Interrupt_setPriority()`函数设置PWM模块中断的优先级。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

命运从未公平

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值