赞
踩
以TIM3为例,STM32的通用定时器氛围TIM2,TIM3,TIM4,TIM5,每个定时器都有独立的四个通道可以用来作为: 输入捕获,输出比较,PWM输出,单脉冲模式输出等。
STM32的定时器除了TIM6和TIM7(基本定时器)之外,其他的定时器都可以产生PWM波输出,高级定时器TIM1,TIM8可以同时产生7路PWM输出,而通用定时器可以同时产生4路PWM输出,这样STM32可以最多同时输出30路PWM输出!
以向上计数为例,讲述PWM原理:
在PWM输出模式下除了CNT(计数器当前值),ARR(自动重装载值),CCRx(捕获/比较寄存器值)。
当CNT小于CCRx时,TIMx_CHx通道输出低电平
当CNT等于或大于CCRx时,TIMx_CHx通道输出高电平
所谓脉宽调制信号(PWM波),就是一个TIMx_ARR自动重装载寄存器确定频率(由它决定PWM周期),TIM_CCRx寄存器确定占空比信号。
向上计数时: 当TIMx_CNT<TIMx_CCRx时通道1为有效电平,否则为无效电平;
向下计数时: 一旦TIMx_CNT>TIMx_CCRx,CCR1通道1为无效电平,否则为有效电平。
向上计数时: 当TIMx_CNT<TIMx_CCRx时通道1为无效电平,否则为有效电平;
向下计数时: 一旦TIMx_CNT>TIMx_CCRx,CCR1通道1为有效电平,否则为无效电平。
是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比。
SG9O电机
硬件接线:
红线 : 3.3v/ 5v
黑 / 棕线 : GND
黄线 : 信号线
舵机的主要组成部分为伺服电机,所谓伺服就是服从信号的要求而动作。在信号来之前,转子停止不动;信号来到之后,转子立即运动。因此我们就可以给舵机输入不同的信号,来控制其旋转到不同的角度。
舵机接收的是PWM信号,当信号进入内部电路产生一个偏置电压,触发电机通过减速齿轮带动电位器移动,使电压差为零时,电机停转,从而达到伺服的效果。简单来说就是给舵机一个特定的PWM信号,舵机就可以旋转到指定的位置。
舵机上有三根线,分别是GND、VCC和SIG,也就是地线、电源线和信号线,其中的PWM波就是从信号线输入给舵机的。
一般来说,舵机接收的PWM信号频率为50HZ,即周期为20ms。当高电平的脉宽在0.5ms~2.5ms之间时舵机就可以对应旋转到不同的角度。
t = 0.5ms——————-舵机会转到 0 °
t = 1.0ms——————-舵机会转到 45°
t = 1.5ms——————-舵机会转到 90°
t = 2.0ms——————-舵机会转到 135°
t = 2.5ms——————-舵机会转到 180°
PWM周期为20ms = 0.02s = (7200*200)/72000000
是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比.由于PWM周期为20ms,所以(以舵机会转动 45°为例),占空比就应该为1ms/20ms = 5%,所以TIM_SetCompare1的 TIMx 捕获比较 1 寄存器值就为200 * 5% = 10
单位: % (0%~100%)
//1.使能GPIO时钟、定时器时钟、复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//2.重映射定时器
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
GPIO_InitTypeDef gpioInitStructure;
//3.配置GPIO
gpioInitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
gpioInitStructure.GPIO_Pin = GPIO_Pin_5; //引脚5
gpioInitStructure.GPIO_Speed = GPIO_Speed_10MHz; //10Hz
GPIO_Init(GPIOB, &gpioInitStructure); //初始化
TIM_TimeBaseInitTypeDef timInitStructure;
//4.配置定时器
timInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //不分频
timInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
timInitStructure.TIM_Period = 200-1; //设置了在下一个更新事件装入活动的自动重装载寄存器周期的值。
timInitStructure.TIM_Prescaler = 7200-1; //设置了用来作为 TIMx时钟频率除数的预分频值。
TIM_TimeBaseInit(TIM3, &timInitStructure); //初始化
//5.配置PWM
timOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //边沿对齐模式
timOCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能
timOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //设置为高电平有效
TIM_OC2Init(TIM3, &timOCInitStructure); //初始化
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //配置自动加载的预加载寄存器
TIM_Cmd(TIM3, ENABLE); //使能
#include "motor.h"
#include "stm32f10x.h"
void motor_Init(void)
{
GPIO_InitTypeDef gpioInitStructure;
TIM_TimeBaseInitTypeDef timInitStructure;
TIM_OCInitTypeDef timOCInitStructure;
<span class="token comment">//1.使能GPIO时钟、定时器时钟、复用时钟</span> <span class="token function">RCC_APB2PeriphClockCmd</span><span class="token punctuation">(</span>RCC_APB2Periph_GPIOB<span class="token punctuation">,</span> ENABLE<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">RCC_APB1PeriphClockCmd</span><span class="token punctuation">(</span>RCC_APB1Periph_TIM3<span class="token punctuation">,</span> ENABLE<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">RCC_APB2PeriphClockCmd</span><span class="token punctuation">(</span>RCC_APB2Periph_AFIO<span class="token punctuation">,</span> ENABLE<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//2.重映射定时器</span> <span class="token function">GPIO_PinRemapConfig</span><span class="token punctuation">(</span>GPIO_PartialRemap_TIM3<span class="token punctuation">,</span> ENABLE<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//3.配置GPIO</span> gpioInitStructure<span class="token punctuation">.</span>GPIO_Mode <span class="token operator">=</span> GPIO_Mode_AF_PP<span class="token punctuation">;</span> gpioInitStructure<span class="token punctuation">.</span>GPIO_Pin <span class="token operator">=</span> GPIO_Pin_5<span class="token punctuation">;</span> gpioInitStructure<span class="token punctuation">.</span>GPIO_Speed <span class="token operator">=</span> GPIO_Speed_10MHz<span class="token punctuation">;</span> <span class="token function">GPIO_Init</span><span class="token punctuation">(</span>GPIOB<span class="token punctuation">,</span> <span class="token operator">&</span>gpioInitStructure<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//4.配置定时器</span> timInitStructure<span class="token punctuation">.</span>TIM_ClockDivision <span class="token operator">=</span> TIM_CKD_DIV1<span class="token punctuation">;</span> timInitStructure<span class="token punctuation">.</span>TIM_CounterMode <span class="token operator">=</span> TIM_CounterMode_Up<span class="token punctuation">;</span> timInitStructure<span class="token punctuation">.</span>TIM_Period <span class="token operator">=</span> <span class="token number">200</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> timInitStructure<span class="token punctuation">.</span>TIM_Prescaler <span class="token operator">=</span> <span class="token number">7200</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token function">TIM_TimeBaseInit</span><span class="token punctuation">(</span>TIM3<span class="token punctuation">,</span> <span class="token operator">&</span>timInitStructure<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//5.配置PWM</span> timOCInitStructure<span class="token punctuation">.</span>TIM_OCMode <span class="token operator">=</span> TIM_OCMode_PWM1<span class="token punctuation">;</span> timOCInitStructure<span class="token punctuation">.</span>TIM_OutputState <span class="token operator">=</span> TIM_OutputState_Enable<span class="token punctuation">;</span> timOCInitStructure<span class="token punctuation">.</span>TIM_OCPolarity <span class="token operator">=</span> TIM_OCPolarity_High<span class="token punctuation">;</span> <span class="token function">TIM_OC2Init</span><span class="token punctuation">(</span>TIM3<span class="token punctuation">,</span> <span class="token operator">&</span>timOCInitStructure<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">TIM_OC2PreloadConfig</span><span class="token punctuation">(</span>TIM3<span class="token punctuation">,</span> TIM_OCPreload_Enable<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">TIM_Cmd</span><span class="token punctuation">(</span>TIM3<span class="token punctuation">,</span> ENABLE<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
#include "stm32f10x.h"
void motor_Init(void);
在STM32第9篇中可以找到 9. STM32——HC_SR04超声波测距
在STM32分栏第9篇中可以找到 9. STM32——HC_SR04超声波测距
在STM32分栏第6篇中可以找到 6. STM32——用串口发送数据点亮LED(串口的中断接收)
在STM32分栏第6篇中可以找到 6. STM32——用串口发送数据点亮LED(串口的中断接收)
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "shake.h"
#include "relay.h"
#include "exti.h"
#include "usart.h"
#include "tim.h"
#include "motor.h"
#include "SysTick.h"
#include "HC_SR04.h"
int main()
{
float Length=0;
// int pwmval=155;
<span class="token function">motor_Init</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">HC_SR04Init</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">usart_init</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
// printf(“abc”);
<span class="token keyword">while</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> Length<span class="token operator">=</span><span class="token function">Get_Length</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%.3f\r\n"</span><span class="token punctuation">,</span>Length<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">delay_ms</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>Length<span class="token operator"><</span><span class="token number">5</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token function">TIM_SetCompare2</span><span class="token punctuation">(</span>TIM3<span class="token punctuation">,</span> <span class="token number">15</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">delay_ms</span><span class="token punctuation">(</span><span class="token number">1000</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span><span class="token punctuation">(</span>Length<span class="token operator">></span><span class="token number">5</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token function">TIM_SetCompare2</span><span class="token punctuation">(</span>TIM3<span class="token punctuation">,</span> <span class="token number">25</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span>
}
如果觉得这篇文章对你有用。欢迎大家点赞、评论哈哈。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。