赞
踩
以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;
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
- #include "main.h"
- #include "pwm.h"
-
-
-
- int main()
- {
-
-
-
-
- tim3_ch4_pwm();//舵机初始化
- printf("初始化成功!!!!!!!\r\n");
-
- SetServoAngle(90);//转动角度90°
-
- while(1)
- {
-
-
-
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。