uint8_t PWM_Update(const float duty) { int16_t _duty=0; if(pwm.stop!=0) { return 1; } if(duty<0) { _duty = 0; } else { _duty = (int16_t)duty; } PWM_Limit_Max(_duty, pwm.limitMax); PWM_Limit_Min(_duty, pwm.limitMin); PWM_PULSE = (uint16_t)_duty; pwm.duty = (float)(_duty/720.0f)*100; return 0; }
时间: 2023-06-27 14:03:34 浏览: 100
这是一个用于更新 PWM 输出的函数,根据传入的占空比参数 duty 进行更新。其中:
- 如果 pwm.stop 的值不为0,表示 PWM 停止工作,直接返回 1。
- 如果 duty 小于 0,将占空比设为 0。
- 否则,将占空比转换成 int16_t 类型,并进行最大最小值限制。
- 将占空比赋值给 PWM 输出寄存器。
- 根据占空比计算实际占空比并保存在 pwm.duty 变量中。
- 返回 0 表示更新成功。
需要注意的是,这段代码中出现了一个常量 720,可能是用来计算实际占空比的分母。如果使用其他类型或者不同的 PWM 频率,需要根据实际情况进行修改。
相关问题
int pwm_config(int id, uint32_t duty_ns, uint32_t period_ns) { uint32_t clk_mhz = ulClkGetRate(CLK_PWM) / 1000000; uint32_t duty = (unsigned long long)duty_ns * clk_mhz / 1000; uint32_t period = (unsigned long long)period_ns * clk_mhz / 1000; writel(0, PWM_REG(id) + PWM_EN); writel(duty, PWM_REG(id) + PWM_DUTY); writel(period, PWM_REG(id) + PWM_CNTR); return 0; }
这段代码是一个函数 `pwm()` 的实现,于配置 PWM(脉宽调制)模块的参数。让我们逐解析代码的功能:
1. `uint32_t clk_mhz = ulClkGetRate(CLK_PWM) / 1000000;`
这行代码获取 PWM 钟频率并将其除以 1000000,得到以 MHz 单位的时钟频率。
2. `uint32_t duty (unsigned long long)duty_ns * clk_m / 1000;`
这代码计算了占空比(duty cycle)的值。首先, `duty_ns` 和 `clk_mhz` 相乘,然后将结果除以 1000。这样可以得到一个以千分之一为单位的占空比数值。
3. `uint32_t period = (unsigned long long)period_ns * clk_mhz / 1000;`
这行代码计算了周期(period)的数值,逻辑与计算占空比的代码相似。将 `period_ns` 和 `clk_mhz` 相乘,然后将结果除以 1000,得到以千分之一为单位的周期数值。
4. `writel(0, PWM_REG(id) + PWM_EN);`
这行代码将 0 写入 PWM 控制寄存器的 PWM_EN 字段,用于禁用 PWM 模块。
5. `writel(duty, PWM_REG(id) + PWM_DUTY);`
这行代码将计算得到的占空比 `duty` 写入 PWM 控制寄存器的 PWM_DUTY 字段,用于设置 PWM 的占空比。
6. `writel(period, PWM_REG(id) + PWM_CNTR);`
这行代码将计算得到的周期 `period` 写入 PWM 控制寄存器的 PWM_CNTR 字段,用于设置 PWM 的周期。
7. `return 0;`
这行代码表示函数执行成功,并返回一个整数值 0。
这段代码的作用是根据给定的占空比和周期配置一个 PWM 模块。在函数执行过程中,根据时钟频率和给定的占空比、周期计算具体数值,并将其写入相应的寄存器来配置 PWM。
void TIM_IRQHandler2(void) { uint16_t duty_cycle2 = PWM_DUTY_CYCLE ; if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM1, TIM_IT_Update); duty_cycle2 += 1; if (duty_cycle2 > MAX_DUTY_CYCLE){ duty_cycle2 = MAX_DUTY_CYCLE; } } }
这段代码是关于定时器中断的处理函数,使用了STM32的TIM模块。当定时器TIM1发生更新中断时,首先通过判断是否为更新中断来进行下一步操作。然后将PWM占空比duty_cycle2加1,如果超过了最大占空比MAX_DUTY_CYCLE就将其限制在最大值内。这段代码可能用于控制PWM输出的占空比,具体实现需要结合其他代码来看。
阅读全文
相关推荐
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![_h_____c](https://img-home.csdnimg.cn/images/20250102104920.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)