PWM控制舵机

输出比较(PWM)

PWM(Pulse Width Modulation)脉冲宽度调制
通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形。

频率=1/周期
占空比=高电平时间/周期
比如:占空比20%等于高电平20%,低电平80%
在这里插入图片描述

输出比较通道

在这里插入图片描述
通过配置寄存器OC1M来规定CNT 和CCR的大小关系来输出oc1ref的高低电平,给输出模式控制器一个信号然后改变OC1ref的高低电平,ref可以映射到主模式的TRGO输出上去,也可以通往下面这一路,给CC1P寄存器写0,信号往上走电平不翻转,反之写1电平翻转。
OC1M模式通常为:PWM模式1和PWM模式2.
PWM模式1:
向上计数 CNT<CCR时,REF为高电平,CNT>=CCR时,REF为低电平。 向下计数 CNT<CCR时,REF为低电平,CNT>=CCR时,REF为高电平;
PWM模式2刚好与PWM模式1相反
输出比较单元:首先CCR捕获/比较寄存器,CCR是我们自己设置的,CNT不断自增运行,同时他俩还在进行比较,当为pwm模式1时, CNT<CCR时,REF为高电平,CNT>=CCR时,REF为低电平。
再进行极性选择(CC1P寄存器),最后输出到GPIO上,就完成了PWM.

代码`

#include "stm32f10x.h"                 

void PWM_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;		//PA0
	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;//输出比较极性(High 高极性 ref波形不翻转直接输出  Low ref取反)
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//使能
	TIM_OCInitStructure.TIM_Pulse =50;		//CCR捕获/比较寄存器 0~ffff
	TIM_OC2Init(TIM2, &TIM_OCI0nitStructure);
	
	TIM_Cmd(TIM2, ENABLE);
}

在这里插入图片描述比如要产生频率为1KHZ,占空比为50%,分辨率为1%,周期为100us的PWM波形
代入公式 :
频:72M/(PSC+1)/(ARR+1)=1000
占:CCR/(ARR+1)=50%
分:1/(ARR+1)=1%
即ARR=100 PSC=720 CCR=50
当ARR+1等于100的时候,占空比直接等于CCR。可以通过调用函数来改变CCR

舵机介绍

在这里插入图片描述
在这里插入图片描述

占空比为2.5% 舵机旋转0度 ,CCR的值为500 .占空比12.50% 舵机旋转180度,CCR的值为2500 即CCR的值与旋转角度关系为 旋转角度/180*2000+500=CCR。

舵机角度控制

void PWM_SetCompare2(uint16_t Compare)//改CCR的值
{
	TIM_SetCompare2(TIM2, Compare);//单独更改通道2的CCR的值
}
void Servo_SetAngle(float Angle) //角度
{
	PWM_SetCompare2(Angle / 180 * 2000 + 500);
}
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值