以STM32F407VGT6单片机为例---------控制舵机转动的角度0-180°
#include "pwm.h"
/*
函数名:tim3_ch4_pwm
函数功能:舵机配置
返回值:void
形参:void
函数说明:
红色线 --- 5V
棕色线 --- GND
橘色线 --- PB1 --- TIM3_CH4
*/
void tim3_ch4_pwm(void)
{
/*IO控制器配置*/
//端口时钟使能
RCC->AHB1ENR |= (1<<1);
//端口模式配置-------复用模式
GPIOB->MODER &= ~(3<<2);
GPIOB->MODER |= (2<<2); //复用
//输出类型
GPIOB->OTYPER &= ~(1<<1);
//输出速度
GPIOB->OSPEEDR &= ~(3<<2);
//上下拉
GPIOB->PUPDR &= ~(3<<2);
//复用功能寄存器
GPIOB->AFR[0] &= ~(0xf<<4);
GPIOB->AFR[0] |= (2<<4); //PB1复用到TIM13_CH1
/*通用定时器控制器配置*/
//定时器时钟使能
RCC->APB1ENR |= 1 << 1;//打开TIM3时钟
//CR1
TIM3->CR1 &=~ (3 << 5);//选择边沿对齐模式
TIM3->CR1 &=~ (1 << 4);//递增计数
TIM3->CR1 &=~ (1 << 3);//循环计数
//设置一个1ms周期 ARR:1000 PSC:84
//PSC
TIM3->PSC = 840 - 1;
//ARR
TIM3->ARR = 2000 - 1;
/*输出比较配置*/
//SMCR
TIM3->SMCR &=~ (7 << 0);//选择内部时钟源
//CCMRx
TIM3->CCMR2 &=~ (3 << 8);//配置通道1为输出
TIM3->CCMR2 |= 1 << 11;//使能通道1输出比较影子寄存器预装载
TIM3->CCMR2 |= 6 << 12;//选择为PWM1模式
//CCER
TIM3->CCER |= 1 << 12;//使能输出比较
TIM3->CCER &=~ (1 << 13);//有效电平为高电平
//PSC
//CCRx
TIM3->CCR4 = 500; //比较寄存器初始值
//EGR
TIM3->EGR |= (1<<0); //人为产生更新事件,更新到影子寄存器
//使能通道1
//计数器使能
TIM3->CR1 |= (1<<0);
}
void SetServoAngle(unsigned char angle)
{
unsigned short pulse = 0;
//针对舵机可转角度限辐
if(angle <= 5) angle = 5;
if(angle >= 175) angle = 175;
//将角度值转换为脉冲值
pulse = (unsigned short)(50 + angle * 100 / 90.0); //此转换公式需根据pwm的arr及psc配置来做相应变化
TIM3->CCR4 = pulse;
}
#include "main.h"
#include "pwm.h"
int main()
{
tim3_ch4_pwm();//舵机初始化
printf("初始化成功!!!!!!!\r\n");
SetServoAngle(90);//转动角度90°
while(1)
{
}
}