STM32之舵机转动————寄存器版

以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)
	{
		
		
		
	}	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点灯之王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值