HPM6700系列—PWM基本用法

PWM介绍

先楫的PWM与其他厂商的有些不同,PWM位于电机系统中,精度是(24+4)位,

更新占空比也比较特殊是将数据放入一个叫做影子寄存器中 通过某种条件来进行更新的

可以使用多个比较器才组成一个PWM,

另外这边需要注意的是PWM时钟是挂在AHB总线上面的,时钟是改不了的。所以如果想要做低赫兹的PWM就要用定时器功能TMR

                            周期 = 重载值/200MHz  

PWM关注一般有几项:重载值,计数方式,占空比,这里加上(更新比较值方式),计数器类型。

流程步骤:

 ●计数器类型(是否开启拓展4位)

 ●互补输出

 ●死区时间

    pwm_config.enable_output = true;
    pwm_config.invert_output = false;
    pwm_config.dead_zone_in_half_cycle = 0;

 ●设置重载值,开始计数值

    pwm_set_reload(PWM, reload, reload);
    pwm_set_start_count(PWM, 0, 0);

 ●设置PWM模式,设置占空比,影子寄存器更新方式

    pwm_get_default_cmp_config(PWM, &cmp_config[0]);
    cmp_config[0].mode = pwm_cmp_mode_output_compare;
    cmp_config[0].cmp  = reload;
    cmp_config[0].enable_ex_cmp = true;
    cmp_config[0].ex_cmp = 0;
    cmp_config[0].update_trigger = pwm_shadow_register_update_on_shlk;

 ●导入参数

 ●使能影子寄存器更新方式

 ●开启PWM

 ●改占空比

    pwm_start_counter(PWM); 
    pwm_cmp_update_cmp_value(PWM, 0, reload/4, 0);
    pwm_issue_shadow_register_lock_event(PWM);
这个是最简单的PWM输出,写这个最主要的目的是为了使用硬件触发ADC序列转换的。之后会学习更复杂一点的PWM模式比如中心对称,故障保护,互补输出这些


综上,如有错误 请大佬们指出,我是一个爱学习的小洛!!

### HPM 上海先辑 PWM 中断使用指南 #### 关于PWM模块概述 HPM上海先辑提供的PWM(Pulse Width Modulation)脉宽调制功能允许设备通过改变信号的占空比来控制外部装置的速度或亮度等参数。对于嵌入式开发而言,掌握如何配置以及处理PWM相关的中断事件至关重要[^1]。 #### 配置PWM输出并启用中断服务程序 为了使能PWM通道上的中断,在初始化阶段需设置特定寄存器位以指定触发条件(比如周期结束、死区时间匹配)。一旦满足这些预设情况,则会激活相应的IRQ请求线并向CPU报告异常状态。下面给出了一段用于开启PWM0比较A匹配中断的例子: ```c // 假定已经完成了必要的硬件资源分配工作 pwm_config_t pwmInfo; /* 初始化结构体 */ memset(&pwmInfo, 0U, sizeof(pwmInfo)); /* 设置频率和分辨率 */ PWM_GetDefaultConfig(&pwmInfo); pwmInfo.channelMode[pwmChannel].level = kPWM_HighTrue; pwmInfo.prescale = kPWM_Prescale_Divide_1; // 可根据实际需求调整分频系数 ... /* 开启对应通道的中断源 */ PWM_EnableInterrupts(PWM_PERIPHERAL_BASEADDR, (uint32_t)(kPWM_CompareAInterruptEnable << channel)); ``` 上述代码片段展示了怎样利用官方SDK函数`PWM_EnableInterrupts()`方法打开所关心类型的中断通知机制[^2]。 #### 编写有效的ISR(Interrupt Service Routine) 当发生预期中的PWM事件时,处理器将会跳转执行预先安排好的中断服务子程序(ISR),该部分逻辑通常定义在一个单独文件里并与向量表关联起来以便快速响应。这里提供了一个简单的模板供参考: ```c void PWM_IRQHandler(void){ /* 清除标志位防止重复进入 */ if(kStatus_Success == PWM_GetStatusFlags(PWM_PERIPHERAL_BASEADDR)){ // 执行具体业务流程... /* 处理完毕后清除相应标记 */ PWM_ClearStatusFlags(PWM_PERIPHERAL_BASEADDR,kPWM_CompareAFlag); } } ``` 这段C语言实现说明了在接收到PWM中断之后应采取哪些措施来进行后续操作,并强调了及时清理状态的重要性以免造成不必要的干扰[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值