一个定时器的不同输出通道不影响,不同通道可以设置不同的PWM比较值,输出不同PWM信号。
void PWM_SetCompare2(uint16_t Compare)//位于CH1那一行的GPIO口使用TIM_SetCompare1这个函数,位于CH2那一行的GPIO口使用TIM_SetCompare2这个函数
{
TIM_SetCompare2(TIM2, Compare);//上面CCR初始化0就行,要改在这个函数改
}
Angle参数表示舵机要旋转到的角度,具体来说,将舵机角度转换为占空比的公式为 Angle / 180 * 2000 + 500,其中180是舵机的最大旋转角度(通常是180度),2500是舵机控制的最大占空比,500是PWM信号的最小占空比,500微秒。因此,当Angle为0时,占空比为500,舵机旋转到最小角度;当Angle为180时,占空比为2500,舵机旋转到最大角度。
原文链接:https://blog.csdn.net/Miraitowain/article/details/130466407
舵机控制的实现代码:
PWM配置:
#include "stm32f10x.h" // Device header
void PWM_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1; //ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1; //PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; //CCR
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_Cmd(TIM2, ENABLE);
}
void PWM_SetCompare2(uint16_t Compare)//位于CH1那一行的GPIO口使用TIM_SetCompare1这个函数,位于CH2那一行的GPIO口使用TIM_SetCompare2这个函数
{
TIM_SetCompare2(TIM2, Compare);//上面CCR初始化0就行,要改在这个函数改
}
舵机控制
#include "stm32f10x.h" // Device header
#include "PWM.h"
void Servo_Init(void)//初始化舵机就是初始化PWM
{
PWM_Init();
}
void Servo_SetAngle(float Angle)
{
PWM_SetCompare2(Angle / 180 * 2000 + 500);//从开始计算,2000被180等分为180个角度分别对应的数,输出angle计算出对应的数,在500的基
//础上加,就能得到转达这个角度需要的占空比
}
主程序:
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Servo.h"
#include "Key.h"
uint8_t KeyNum;
float Angle;
int main(void)
{
OLED_Init();
Servo_Init();
Key_Init();
OLED_ShowString(1, 1, "Angle:");
while (1)
{
KeyNum = Key_GetNum();
if (KeyNum == 1)
{
Angle += 30;
if (Angle > 180)//控制角度大于180超出工作范围,直接停转
{
Angle = 0;
}
}
Servo_SetAngle(Angle);
OLED_ShowNum(1, 7, Angle, 3);
}
}