1.什么是输出比较
2.PWM简介
3.常用PWM模式
3.PWM基本结构
推挽电路三种状态
上管导通下管断开输出高电平
下管导通上管断开输出低电平
上下都断开输出高阻态
4.舵机简介
5.什么是直流电机
6.电机驱动模块硬件电路
7.PWM接线图
通过PA0驱动LED:占空比越大LED越亮,占空比越小LED越暗
TIM_OC1Init(配置数字比较初始化)
TIM_OCStructInit(给输出比较赋一个默认值)
TIM_ForcedOC1Config(配置强制输出模式,暂停输出波形并强制输出高低电平)
TIM_OC1PreloadConfig(配置OC预装功能)
TIM_OC1FastConfig(配置使能)
TIM_ClearOC1Ref(外部事件中清除REF事件)
*结构体初始化那里也可以设置极性与这个地方设置极性一样
TIM_OC1PolarityConfig(配置输出比较高极性)
TIM_OC1NPolarityConfig(配置输出比较低极性)
TIM_CCxCmd(修改输出使能参数的)
TIM_SelectOCxM(更改输出比较函数)
TIM_SetCompare1(单独更改输出寄存器值的函数)
TIM_CtrlPWMOutputs(仅高级寄存器实用PWM输出波形调用其函数)
8.TIM_OCInitTypeDef配置思路
TIM_OCMode:设置输出比较模式
TIM_OCPolarity:设置输出极性
TIM_OutputState:设置输出使能
TIM_Pulse:初始的CCR值
因为你没有给结构体全部函数调用所以可能会导致结构体变量内存布局混乱导致硬件出现问题
所以先用TIM_OCStructInit这个函数先把结构体初始化一下
就相当于先给结构体全部赋值了一遍,然后把其内部的值在修改
当你同时想使用USART2_TX以及TIM2_CH3但是他们的引脚又是同一个引脚PA2咋办,
当当当当!AFIO(重映射)这个功能就是将有一些相同通道功能映射到另一个引脚上(映射表上要有)比如TIM2_CH3在PB10上能重映射,所以你就可以用AFIO将其映射到PB10上,然后就能同时用USART2_TX和TIM2_CH3
为什么用复用推挽输出:相比较推挽输出输出控制有数据寄存器控制,复用推挽输出则用片上外设控制,引脚控制权交给片上外设,PWM波形才能通过引脚输出
计算ARR=100-1,CCR=50,PSC=720-1,频率为1KHZ占空比为50%波形、
TIM_InternalClockConfig(将TIM2设置为外部时钟)
TIM_SetCompare1设置CCR的值根据上面个公式CCR减小占空比减小灯越暗
9.重映射思路
1.开启AFIO时钟:RCC_APB2PeriphClockCmd
2.GPIO_PinRemapConfig(重映射关系)
因为PA15是默认为JTDI所以要使用就要先关闭调试功能使用
通过这三个参数解除调试功能禁用
GPIO_Remap_SWJ_NoJTRST这个函数解除NJTRST
GPIO_Remap_SWJ_JTAGDisable,解除JTAG保留SWD复用
不要随便用SWJ_Disable:这个函数使用了就代表St_link无法下载了,要重新烧录
10.舵机实验接线图
PSC和ARR的值可以自己安排
占空比duty=CCR/20K,
CCR可以TIM_SetCompare1设置输入信号脉冲宽度,
当CCR=0.5ms时为0度,2500时为180度,1500时为90度
因为舵机要求周期为20ms,所以他的频率为1/20ms=50HZ
y=Kx+b
10.直流电机电路图
A01接正,AO2接负,若是接反了则电机会反转
STBY待机,因为咱们不需要待机,所以直接接高电平,
AIN1与AIN2是方向控制引脚任意接两个GPIO
PWMA是速度控制引脚
11直流电机思路
void PWM_Init(void)
{
/*开启时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //将PA2引脚初始化为复用推挽输出
//受外设控制的引脚,均需要配置为复用模式
/*配置时钟源*/
TIM_InternalClockConfig(TIM2); //选择TIM2为内部时钟,若不调用此函数,TIM默认也为内部时钟
/*时基单元初始化*/
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //定义结构体变量
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器模式,选择向上计数
TIM_TimeBaseInitStructure.TIM_Period = 100 - 1; //计数周期,即ARR的值
TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1; //预分频器,即PSC的值
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //重复计数器,高级定时器才会用到
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); //将结构体变量交给TIM_TimeBaseInit,配置TIM2的时基单元
/*输出比较初始化*/
TIM_OCInitTypeDef TIM_OCInitStructure; //定义结构体变量
TIM_OCStructInit(&TIM_OCInitStructure); //结构体初始化,若结构体没有完整赋值
//则最好执行此函数,给结构体所有成员都赋一个默认值
//避免结构体初值不确定的问题
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //输出比较模式,选择PWM模式1
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性,选择为高,若选择极性为低,则输出高低电平取反
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //初始的CCR值
TIM_OC3Init(TIM2, &TIM_OCInitStructure); //将结构体变量交给TIM_OC3Init,配置TIM2的输出比较通道3
/*TIM使能*/
TIM_Cmd(TIM2, ENABLE); //使能TIM2,定时器开始运行
}
然后设置一边电压高一边电压低形成电压差,PWM_SetCompare3来控制电机转的速度
因为电机想起来有嗡嗡的声音
目前频率为:72MHZ/720/100=1KHZ
人耳能听到频率为20HZ到20KHZ,所以加大频率通过改变预分频器PSC频率可以不影响占空比