PWM是什么

这就是PWM
所以说pwm也就是波不断上上下下
那么要实现准确的间隔那么还是离不开定时器

对的,这里的捕获和比较基本就是给PWM准备的

我们只需要CNT和CCR比较
比如CNT运行到设置的CCR值就翻转
但是CNT记满会自动复位也就是一次轮回
这个记满是由(ARR+1)决定的
但是CNT是由CK_PSC(输入时钟)和PSC(预分频器)决定的
为什么用CK_PSC而不是CK_INK因为他还可以由外部时钟,或者内部其他时钟决定
也就是CNT=CK_PSC=CK_PSC/(PSC+1)
CNT是频率转换成时间单位就是1/[(CK_PSC/PSC+1)]=(PSC+1)/CK_PSC
那么CNT的周期就是(PSC+1)/CK_PSC
那么一个PWM的周期就是(CNT的周期)(ARR+1)=[(PSC+1)/CK_PSC](ARR+1)
=[(ARR+1)(CK_PSC)]/(PSC+1)
换算成频率就是1/[[(ARR+1)(CK_PSC)]/(PSC+1)]=(PSC+1)/[(ARR+1)(CK_PSC)]
=(PSC+1)/(ARR+1)/(CK_PSC)
因为我们知道了到了CCR的值就会翻转
那么CCR(CNT的周期)我们就知道他到了多少的时间就会翻转
那么一个周期的时间是(CNT的周期)(ARR+1)
那么也就说占空比就是[CCR(CNT的周期)]/[(CNT的周期)*(ARR+1)]=CCR/(ARR+1)

分辨率是什么:就是波他的最小单位,他最多可以分成多少份

参考代码函数
PWM初始化
我们先用安全模式启动
1 | void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct); |
TIM_OCInitTypeDef TIM_OCInitStructure;
所有参数设置为默认,你初始化按需求改就可以了
然后我们再按需配置需求
默认配置
| 结构体成员 | 默认值 | 含义 |
|---|---|---|
| TIM_OCMode | TIM_OCMode_Timing | 输出比较定时模式(无硬件输出) |
| TIM_OutputState | TIM_OutputState_Disable | 通道输出失能 |
| TIM_OutputNState | TIM_OutputNState_Disable | 互补通道输出失能 |
| TIM_Pulse | 0 | 比较值(CCR)= 0 |
| TIM_OCPolarity | TIM_OCPolarity_High | 输出极性高有效 |
| TIM_OCNPolarity | TIM_OCNPolarity_High | 互补通道极性高有效 |
| TIM_OCIdleState | TIM_OCIdleState_Reset | 空闲状态低电平 |
| TIM_OCNIdleState | TIM_OCNIdleState_Reset | 互补通道空闲低电平 |
1 | void TIM_OC-xInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| TIM_TypeDef* TIMx | TIM_TypeDef* | — | 选择要初始化的定时器 |
| TIM_OC-xInit | -x | 选择CH通道 | 1-4(直接填数字比如:TIM_OC1Init) |
| TIM_OCInitTypeDef* TIM_OCInitStruct | — | 结构体 | — |
| 返回值 | 无 | 无 | 无 |
TIM_OCInitTypeDef TIM_OCInitStructure;
| 名称 | 作用 | 参数 |
|---|---|---|
| TIM_OCInitStructure.TIM_OCMode | 设置模式 | TIM_OCMode_Timing ((uint16_t)0x0000)冻结模式 TIM_OCMode_Active ((uint16_t)0x0010)相等时为有效电平 TIM_OCMode_Inactive ((uint16_t)0x0020)相等时为无效电平 TIM_OCMode_Toggle ((uint16_t)0x0030)相等时电平翻转 TIM_OCMode_PWM1 ((uint16_t)0x0060) pwm1 TIM_OCMode_PWM2 ((uint16_t)0x0070) pwm2 |
| TIM_OCInitStructure.TIM_OutputState | 使能输出 | TIM_OutputState_Enable 使能输出 TIM_OutputState_Disable 禁止输出 |
| TIM_OCInitStructure.TIM_OCPolarity | 配置输出电平 | TIM_OCPolarity_High 高电平有效 TIM_OCPolarity_Low 低电平有效 |
| TIM_OCInitStructure.TIM_Pulse | 设置CCR | 0-65535 |

REF是输出的电平
REF = 1(高电平)= 有效电平(Active)
REF = 0(低电平)= 无效电平(Inactive)
强制无效电平
直接把 REF 置 0(无效)
CNT、CCR 完全不起作用
强制有效电平
直接把 REF 置 1(有效)
同样 CNT、CCR 完全不起作用
修改CCR
1 | void TIM_SetCompare-x(TIM_TypeDef* TIMx, uint16_t Compare2); |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| TIM_TypeDef* TIMx | TIM_TypeDef* | — | 选择要的定时器 |
| uint16_t Compare2 | uint16_t | 设置CCR的值 | 0-65525 |
| TIM_SetCompare-x | -x | 选择要改的CH通道 | 1-4(比如:TIM_SetCompare-x) |
| 返回值 | 无 | 无 | 无 |