#include "pwm.h"
/*
* 对电机的控制
* 端口PB9
* PWM 除了定时器6和7之外其他定时器都能产生PWM
* 高级定时器1与8 -->7路 通用定时器2-5 -->4路
* PSC : 预分频 16位 65536 ARR :自动重装载值 到达装载值响应中断或事件
* TIM_CCRx 改变占空比 占一个周期的多少 CCR/ARR的比值 ARR为周期最大值 遇到CCR切换电平
* CNT为定时器 有递增 递减 中心(周期结束又从定时器的结束位退回) //定时为一个周期
* PWM1 递增 定时器递增 到CCR之前有效 高电平 到CCR之后无效 低电平
*
* 配置步骤:
* 1.定时器时钟 复用AFIO 端口时钟
* 2.TIM3--PA7 PB5(重映射) GPIO_PinRemapCofig
* 3.端口模式 AF_PP 复用
* 4.定时器初始化
* 5.PWM参数配置 TIM_OCxTint(TIMx,&)
* OCMOde PWM1
* Pulse 脉冲
* OCP0 输出极性
*
* 目标 PB9
*/
//自动重装在值,预频率系数
void TIM4_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStrue; //端口配置结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定时器结构体
TIM_OCInitTypeDef TIM_OCInitStructure; // 输出(OC)比较结构体(PWM)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); //开启端口B和复用时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //开启定时器TIM4的时钟
//端口配置 选择通道
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9; //引脚
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz; //速度
GPIO_Init(GPIOB,&GPIO_InitStrue);
// GPIO_PinRemapConfig(GPIO_PartialRemap_TIM4,ENABLE); // TIM4 端口映射
//定时器配置 选择定时器
TIM_TimeBaseStructure.TIM_Period = arr; //周期值 ARR 最大值65535
TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频率系数 时钟信号预分频才得到时钟信号
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分频 不分频 基本定时器没有
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数方式 向上计数 向下计数 中心对齐
// TIM_TimeBaseStructure.TIM_RepetitionCounter //重复计数器 只用于高级定时器
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //选择定时器 结构体
//输出比较初始化 PWM
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2; //模式 PWM1 PWM1
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low; //输出极性 到底时高为有效还是低电平有效
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; // 使能 到IO口
TIM_OC4Init(TIM4,&TIM_OCInitStructure); //4为通道 选择定时器 悬着结构体成员
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能 CCR 预装载值的寄存器
TIM_Cmd(TIM4,ENABLE); //开启定时器 定时器名 和使能
}
// TIM_SetCompare4(TIM4,500); // 舵机0度
// TIM_SetCompare4(TIM4,1000); // 舵机45度
// TIM_SetCompare4(TIM4,1500); // 舵机90度
// TIM_SetCompare4(TIM4,1000); // 舵机135度
// TIM_SetCompare4(TIM4,2500); // 舵机180度
//主函数调用
//1.初始化
// TIM4_PWM_Init(500,72-1); //频率是2Kh 频率要适合 太快 太慢都不好 72/72=1us*500=0.5ms PWM的输出频率
//2.发送信号
// TIM_SetCompare2(TIM4,i); //i值最大可以取499,因为ARR最大值是499. 修改占空比 参:定时器名 比较值
//CCR不能大于CNT计数器的值 大于会全部是高电平 即不会大于TIM3_CH2_PWM_Init(500,72-1) 中500值
//这里的 i 为有效电平