做网站类型的营业执照证明如何填写,docker wordpress git,大连做网站外包,大型网站 建设意义文章目录 输出比较单元特点 高级定时器#xff1a;均有4个通道 PWM简介PWM#xff08;Pulse Width Modulation#xff09;脉冲宽度调制输出比较通道PWM基本结构基本定时器 参数计算捕获/比较通道的输出部分详细介绍如下#xff1a; 舵机介绍硬件电路 直流电机介绍#xff… 文章目录 输出比较单元特点 高级定时器均有4个通道 PWM简介PWMPulse Width Modulation脉冲宽度调制输出比较通道PWM基本结构基本定时器 参数计算捕获/比较通道的输出部分详细介绍如下 舵机介绍硬件电路 直流电机介绍直流电机驱动代码 输出比较库函数 输出比较单元
名词解释 IC input capture 输入捕获 OC outpucompare 输出比较 CC capture compare 输入捕获和输出比较的单元 OCOutput Compare输出比较 用来输出PWM波形
特点 输出比较可以通过比较CNT计数器与CCR捕获/比较寄存器值的关系来对输出电平进行置1、置0或翻转的操作用于输出一定频率和占空比的PWM波形。 每个高级定时器和通用定时器都拥有4个输出比较通道 高级定时器的前3个通道额外拥有死区生成和互补输出的功能用于驱动三相无刷电机 通用定时器均有4个通道 高级定时器均有4个通道 PWM简介
PWMPulse Width Modulation脉冲宽度调制
必须是在具有惯性的系统中可以通过对一系列脉冲的宽度进行调制来等效地获得所需要的模拟参量常应用于电机控速等领域 PWM参数 频率 1 / TS 占空比 TON / TS 分辨率 占空比变化步距 (PWM的频率在几千到几十KHZ就已经很快了)分辨率 表示占空比的精细程度
TON高电平的时间TS一个周期的时间 (频率 1 / TS 可以看出周期越大那么频率就越小就越平稳。 占空比 TON / TS) TON/TS高电平相对整个周期的比例 如果TON 20% 那么低电平就是80%占空比越大等效的模拟电压就越接近于高电平。
PWM调光通过高频点亮熄灭点亮熄灭来实现对灯光强弱的控制只要闪的够快就发现不了是正常的还是没有的
原因LED熄灭时由于人眼的余辉和视觉暂留现象LED不会立刻熄灭过一小段才会熄灭电机也是因为惯性过一会才会停下来
输出比较通道
极性选择就是选择要不要把高低电平反转一下
PWM基本结构 占空比和CCR值有关
基本定时器 参数计算 PWM输出的通道口时CH1 根据引脚定义表得出GPIO口时PA0 输出模式选用复用推挽输出原因是采用定时器来进行输出控制CCR的值 根据PWM频率 Freq CK_PSC / (PSC 1) / (ARR 1) : 72MHZ/(PSC1)/(ARR1) 1000 PSC1 72000000/1000000720HZ PWM占空比 Duty CCR / (ARR 1) CCR/(ARR1) 50% --》 CCR 50 PWM分辨率 Reso 1 / (ARR 1) 1/ARR1) 1% --》ARR1 100 分辨率是自己给的
捕获/比较通道的输出部分 对于普通的推挽输出引脚的控制权来自于输出数据寄存器来进行输出控制 而想要定时器来控制引脚就需要使用复用开漏推挽输出。定时器属于片上外设
重复次数计数器 实现每隔几个周期再更新一次。之前是每个周期都更新对更新信号再分频DTG死区生成电路防止电流直通RK刹车输入功能给电机驱动提供安全保证。如内部时钟失效控制电路会自动切断电路AFIO端口重映射
如果要重定义某个端口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//给AFIO使能
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE); //重映射 把CH1的PA0换到PA15
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable ,ENABLE);//关闭PA15的调试端口的功能详细介绍如下
RCC 把GPIOTIM外设的时钟打开配置时基单元配置输出比较单元时钟源选择配置输出比较单元CCR的值输出比较模式极性选择输出使能配置GPIO 配置为复用推免运行控制启动计数器 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//给TIM2使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//给GPIO使能GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode GPIO_Mode_AF_PP; //由于定时器属于片上外设所以采用复用推挽输出GPIO_InitStruct.GPIO_Pin GPIO_Pin_0; //根据引脚表的出CH_1所在引脚时PA0GPIO_InitStruct.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStruct);TIM_InternalClockConfig(TIM2); //选择内部时钟 给时基单元提供时钟//时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_ClockDivision TIM_CKD_DIV1; //每一个时钟后面都会加一个滤波器//作用就是为是信号更加稳定使用的采样的方式//在输入的脉冲中采样按照n/f因此采样系数越大延迟越大TIM_TimeBaseInitStruct.TIM_CounterMode TIM_CounterMode_Up; //计数方式递增TIM_TimeBaseInitStruct.TIM_Period 100-1; //ARR 100 TIM_TimeBaseInitStruct.TIM_Prescaler 720-1; // psc 720//预分频器72MHZ进行7200分频 //72000/7200 10KHZ 1ms 1KHZ //10KHZ下记10000个数 10000/10000HZ 1S// f 1/t TIM_TimeBaseInitStruct.TIM_RepetitionCounter 0; //重复计数器高级定时器才有TIM_TimeBaseInit(TIM2,TIM_TimeBaseInitStruct);//配置比较输出模块TIM_OCInitTypeDef TIM_OCInitStruct;TIM_OCStructInit(TIM_OCInitStruct);//给结构体赋初始值TIM_OCInitStruct.TIM_OCMode TIM_OCMode_PWM1;//输出比较模式//TIM_OCInitStruct.TIM_OCNIdleState ; //带N的都是高级定时器才用的//TIM_OCInitStruct.TIM_OCNPolarity ;TIM_OCInitStruct.TIM_OCPolarity TIM_OCPolarity_High; //输出比较极性//TIM_OCInitStruct.TIM_OutputNState ;TIM_OCInitStruct.TIM_OutputState TIM_OutputState_Enable; //使能输出状态TIM_OCInitStruct.TIM_Pulse 50;//CCR的值TIM_OC1Init(TIM2,TIM_OCInitStruct); //运行控制所有的模块配置完毕启动时基单元TIM_Cmd(TIM2,ENABLE);//如果要使用高级定时器就需要把TIM2改为TIM1那么结构原来用不到的成员。就需要用到这些成员又没有赋值//这个时候就会出现奇怪的问题如果把初始化函数放在的程序第一行没有问题初始化函数前面出现了其他的代码那么4路PWM就会有3路不能输出。这竟然和初始化函数在那一行有关。//原因是没有给结构体配置完整也没有给结构体赋初始值。所以要用到structInit()函数给结构体赋初始值。舵机介绍
舵机是一种根据输入PWM信号占空比来控制输出角度的装置 输入PWM可当作一种输出协议信号要求周期为20ms高电平宽度为0.5ms~2.5ms
PWM输入到控制板给控制板一个指定的目标角度然后这个电位器检测当前的输出角度如果大于目标角度电机就会反转
硬件电路 void Servo_Init(void)
{PWM_Init();
}void Servo_SetAngle(float Angle)
{//0 500 //180 2500 度数 PWM_SetCompare2(Angle / 180 * 2000 500);
}PWM驱动舵机
直流电机介绍 直流电机驱动代码
1.RCC使能GPIO 2.选择时钟给定时器单元使能 3.配置时基单元也就是计数模块 4.配置输出比较模块 5.启动时基单元 6.逻辑函数
选用的是通用定时器TIM2 由于直流电机上的PWMA连接的是PA2口根据引脚定义表。PA2对应的时钟通道是TIM2_CH3. 所以在选择输出比较通道时选择初始化3通道。TIM_OC3Init(TIM2,TIM_OCInitStruct);
void Motor_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_PP; //推挽输出模式高低电平均可以亮GPIO_InitStruct.GPIO_Pin GPIO_Pin_4|GPIO_Pin_5; //方向控制角GPIO_InitStruct.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStruct); PWM_Init();
}void Motor_SetSpeed(uint8_t speed)
{if(speed 0){GPIO_SetBits(GPIOA,GPIO_Pin_4); //给端口4给高 5给低 正转GPIO_ResetBits(GPIOA,GPIO_Pin_5);PWM_SetCompare3(speed); //给PWM设置CCR的值 捕获比较值根据不同CCR的值得到PWM波也不同输出的速度自然不同} else{GPIO_ResetBits(GPIOA,GPIO_Pin_4); //给端口4给低 5给高 反转GPIO_SetBits(GPIOA,GPIO_Pin_5);PWM_SetCompare3(-speed);}
}输出比较库函数
//配置输出比较单元
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);//配置强制输出模式
//如果暂停输出波形并且强制输出高/低电平强制设置高电平和设置100%占空比是一样的
void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);//用来单独设置输出比较的极性带N的就是高级定时器互补通道的配置OC4没有互补通道所以没有OC4N的函数。
void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
//用来单独修改输出使能函数
void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);
void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);
//单独修改选择输出比较模式
void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);
//用来单独修改CCR寄存器值的函数 更改占空比 掌握
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);//这个函数仅再高级定时器使用在使用高级定时器输出PWM时需要调用这个函数使能主输出否则PWM将不再正常输出
void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);