简述网站开发工作流程,wordpress对接易支付宝,建一个简单的公司官网需要多少钱,近一周国内重大新闻文章目录 输出比较PWM输出比较通道参数计算舵机简介直流电机简介TB6612 PWM基本结构PWM驱动呼吸灯PWM驱动舵机PWM控制电机 输出比较
输出比较#xff0c;简称OC#xff08;Output Compare#xff09;。 输出比较的原理是#xff0c;当定时器计数值与比较值相等或者满足某种… 文章目录 输出比较PWM输出比较通道参数计算舵机简介直流电机简介TB6612 PWM基本结构PWM驱动呼吸灯PWM驱动舵机PWM控制电机 输出比较
输出比较简称OCOutput Compare。 输出比较的原理是当定时器计数值与比较值相等或者满足某种特定条件时比较通道会产生一个输出信号这个输出信号可以用来触发外部事件如控制其他外设的操作或者驱动外部电路。 在每个高级定时器和通用定时器都拥有4个输出比较通道。 高级定时器的前3个通道额外拥有死区生成和互补输出的功能。
PWM
我们可以利用输出比较来对外产生一个PWM频率。 PWMPulse Width Modulation脉冲宽度调制是一种常用的控制信号技术。通过改变信号的脉冲宽度来控制电力开关装置的平均功率。在PWM中周期保持不变而脉冲的宽度可以根据需要进行调整。 PWM技术广泛应用于电力电子领域特别是在电机控制和电源调节方面。通过调整PWM信号的占空比脉冲宽度与周期之比可以精确地控制输出信号的平均电压或电流。这种控制方式可以实现对电机速度、亮度、电压等参数的精确控制具有高效率、高精度和低成本的优点。 频率1/Ts占空比Ton/Ts分辨率占空比的变化步距。 我们可以利用输出比较对输出电平进行一定程度的控制就能输出PWM频率。
输出比较通道
通用定时器总框图。
放大效果 在比较通道左边CNT计数器与捕获/比较寄存器中的值进行比较大小再根据控制器就会输出一定的电平。 ETRF是定时器的小功能一般不用到。 REFrreference实际上就是指这里信号的高低电平。REF可以映射到主模式的TRGO输出上去;REF的主要去向是去到输出使能电路它会先走向一个寄存器如果寄存器输出为0那么电平将不翻转保持原样如果信号为1REF会通向一个非门取反也就是高低电平翻转的信号接着通过使能电路将有一个寄存器CC1E控制最后到OC1引脚接到CH1通道上。 输出模式控制器可以根据自己需求来选择模式
参数计算 红色线表示CCR也就是比较值黄色线表示自动装载寄存器中的值ARR);蓝色线表示计数值CNT 当CNTCCR时输出高电平当CNTCCR时输出低电平。 这里对应的是PWM模式1的向上计数。 PWM频率 Freq CK_PSC / (PSC 1) / (ARR 1) PWM占空比 Duty CCR / (ARR 1) PWM分辨率 Reso 1 / (ARR 1) 舵机简介
舵机Servo是一种常用的电动执行器通常用于控制机械运动和定位定位。它由一个直流电机、减速装置、位置反馈装置和控制电路组成。 舵机的工作原理是控制电路根据输入信号生成特定的PWM信号并驱动直流电机和减速装置运转使输出轴转动到所需的位置。位置反馈装置常用的是旋转式电位器会实时监测输出轴的位置并将信息反馈给控制电路以便进行修正和精确控制。 SG90使用要求输入PWM信号要求周期为20ms高电平宽度为0.5ms~2.5ms 硬件电路
直流电机简介
直流电机是一种将电能转换为机械能的装置有两个电极当电极正接时电机正转当电极反接时电机反转。 直流电机属于大功率器件GPIO口无法直接驱动需要配合电机驱动电路来操作。
TB6612
TB6612是一款双路H桥型的直流电机驱动芯片常用于控制直流电机的转动方向和速度。它具有高效率、低功耗和高输出等特点适用于各种电机驱动应用。 TB6612芯片内部集成了H桥驱动电路可通过控制引脚实现正转、反转、制动和浮动等操作。它可以工作于3.3V或5V逻辑电平支持PWM输入控制电机速度并提供过流保护功能防止电机过载。
硬件电路
PWM基本结构 通过配置时基单元让计时器驱动与CCR比较在PWM模式1下输出电平最后通向GPIO口。
PWM驱动呼吸灯
接线模式 PWM.h
#ifndef __PWM_H__
#define __PWM_H__void PWM_Init();
void PWM_SetCompare(uint16_t Compare);#endif
PWM.c
#include stm32f10x.h // Device headervoid PWM_Init()
{//开启APB1外设开关RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_ModeGPIO_Mode_AF_PP; //复用推挽输出GPIO_InitStructure.GPIO_PinGPIO_Pin_0;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);//配置内部时钟TIM2TIM_InternalClockConfig(TIM2);//时钟结构体初始化TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivisionTIM_CKD_DIV1; //不分频TIM_TimeBaseInitStructure.TIM_CounterModeTIM_CounterMode_Up; //计时器模式TIM_TimeBaseInitStructure.TIM_Period100-1; //自动加载寄存器周期值TIM_TimeBaseInitStructure.TIM_Prescaler1-1; //预分频值TIM_TimeBaseInitStructure.TIM_RepetitionCounter0; //指定重复计时器的值这里不用到TIM_TimeBaseInit(TIM2,TIM_TimeBaseInitStructure);//配置输出比较结构体TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(TIM_OCInitStructure);TIM_OCInitStructure.TIM_OCModeTIM_OCMode_PWM1; //配置输出比较模式TIM_OCInitStructure.TIM_OCPolarityTIM_OCPolarity_High; //指定输出极性TIM_OCInitStructure.TIM_OutputStateTIM_OutputState_Enable;//输出比较状态TIM_OCInitStructure.TIM_Pulse0; //指定要捕获的脉冲值CCRTIM_OC1Init(TIM2,TIM_OCInitStructure);//启用TIM2外设控制TIM_Cmd(TIM2,ENABLE);}
//设置CCR比较值
void PWM_SetCompare(uint16_t Compare)
{TIM_SetCompare1(TIM2,Compare);
} 对于GPIO口来说不止是接通了外设还需要将PWM频率传输给外设所以使用了复用推挽输出。 输出比较结构体有多个成员我们这里一些成员不用到所以先进行结构体初始化再进行对一些成员的赋值。 main.c
#include stm32f10x.h // Device header
#include Delay.h
#include PWM.huint16_t i;int main()
{OLED_Init();PWM_Init();while(1){for(i0;i100;i){PWM_SetCompare(i);Delay_ms(10);}for(i0;i100;i){PWM_SetCompare(100-i);Delay_ms(10);}}
}PWM驱动舵机 OLED函数所取地址 连接方式 SYTM32驱动电压只有3.3V舵机需要5V的驱动电压 Servo.c
#include stm32f10x.h // Device header
#include PWM.hvoid Servo_Init()
{PWM_Init();
}void Servo_SetAngle(float Angle)
{PWM_SetCompare(Angle/180*20050);
}
Servo.h
#ifndef __SERVO_H__
#define __SERVO_H__void Servo_Init();
void Servo_SetAngle(float Angle);#endif 这里的PWM频率是有要求的所以需要将PWM.c的CNT和ARR进行修改频率72M/720/200050Hz。 这里的转动度数需要根据占空比来进行计算 Key.c #include stm32f10x.h // Device header
#include Delay.hvoid Key_Init(void)
{//设置APB2外设时钟开关RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//对结构体成员的选择GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin GPIO_Pin_1 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;//结构体初始化GPIO_Init(GPIOB, GPIO_InitStructure);
}//获取键码
uint8_t Key_GetNum(void)
{uint8_t KeyNum 0;if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) 0){Delay_ms(20);while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) 0);Delay_ms(20);KeyNum 1;}if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) 0){Delay_ms(20);while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) 0);Delay_ms(20);KeyNum 2;}return KeyNum;
}
Key.h
#ifndef __KEY_H_
#define __KEY_H_void Key_Init(void);
uint8_t Key_GetNum(void);#endif
main.c
#include stm32f10x.h // Device header
#include Delay.h
#include OLED.h
#include Servo.h
#include Key.h
uint16_t angle;
int main()
{OLED_Init();Servo_Init();Key_Init();OLED_ShowString(1,1,Angle:);while(1){if(Key_GetNum()1){angle30;if(angle180){angle0;}}Servo_SetAngle(angle);OLED_ShowNum(1,7,angle,3);}}
PWM控制电机
接线方式 Motor.h
#ifndef __MOTOR_H__
#define __MOTOR_H__void Motor_init();
void Motor_GetSpeed(int8_t Speed);#endif
Motor.c
#include stm32f10x.h // Device header
#include PWM.hvoid Motor_init()
{//设置APB2外设时钟开关RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//对结构体成员的选择GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin GPIO_Pin_4 | GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;//结构体初始化GPIO_Init(GPIOA, GPIO_InitStructure);PWM_Init();
}
//速度输入函数
void Motor_GetSpeed(int8_t Speed)
{if(Speed0){GPIO_SetBits(GPIOA,GPIO_Pin_5);GPIO_ResetBits(GPIOA,GPIO_Pin_4);PWM_SetCompare(Speed);}else{GPIO_SetBits(GPIOA,GPIO_Pin_4);GPIO_ResetBits(GPIOA,GPIO_Pin_5);PWM_SetCompare(-Speed);}
} PWM的占空比作为速度的调节两个接口的正反接作为方向的控制。 对于电机驱动电路所接引脚需要进行GPIO口的初始化 当输入速度为负时将接口上引脚进行电平翻转读者可以进行尝试怎么接为正怎么接为负对于小于0的速度需要加上符号变成正数。 main.c
#include stm32f10x.h // Device header
#include Delay.h
#include OLED.h
#include Motor.h
#include Key.h
int8_t Speed;
int main()
{OLED_Init();Motor_init();Key_Init();OLED_ShowString(1,1,Speed:);while(1){if(Key_GetNum()1){Speed20;if(Speed100){Speed-100;}}Motor_GetSpeed(Speed);OLED_ShowSignedNum(1,7,Speed,3);}
}