STM32的PWM信号控制

  1. 舵机
    电源线通常是红色的,应该连接到Arduino控制板上的5V针脚;
    GND地线通常是黑色或棕色的,应该连接到ULN2003 IC上10-16针的任意一个;
    信号线通常是黄色或白色的,应该连接到Arduino 9号引脚
    3.PWM

pwm输出
CCRx ARR CNT
与CCRx进行比较,比CCRx低输出低电平,比CCRx高输出高电平
ARR决定周期,前提是与定时器有关,占空比是由CCRx决定的

呼吸灯

一般舵机脉冲周期为20ms,宽度为1.5ms

周期=装载值x分频系数 / 72MHz(定时器时钟)

#include "timer.h"

void Servo_PWM_Init(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;//定义结构体变量
	TIM_OCInitTypeDef TIM_OCInitStructure;//定义输出比较结构体变量
    GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体变量

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//GPIO时钟使能
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能复用时钟

	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;//配置GPIO引脚
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置GPIO速率
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//配置GPIO为复用推挽输出
	GPIO_Init(GPIOB,&GPIO_InitStructure);//GPIO初始化函数

	TIM_TimeBaseStruct.TIM_Period=9999;//设置自动装载的周期值,计算方法多了
	TIM_TimeBaseStruct.TIM_Prescaler=143;//设置预分频系数
	TIM_TimeBaseStruct.TIM_ClockDivision=0;//设置时钟分割,0同TIM_CKD_DIV1
	TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
	TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStruct);//定时器初始化函数

	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//PWM模式1
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//输出比较极性高
    //多舵机,怎么控制,同一个定时器下的四个通道,所以,下面的8句就很重要
	TIM_OC1Init(TIM4,&TIM_OCInitStructure);//比较输出初始化函数,通道1
	TIM_OC2Init(TIM4,&TIM_OCInitStructure);
	TIM_OC3Init(TIM4,&TIM_OCInitStructure);
  TIM_OC4Init(TIM4,&TIM_OCInitStructure);

	TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);//输出比较1预装载寄存器使能
  TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);
	TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);
	TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable);

	TIM_Cmd(TIM4,ENABLE);//TIM4使能,忘了就前功尽弃了
}

名词解释:
占空比:单片机通过测量输入脉冲的高电平时间及周期而实现占空比测量
周期:PWM一个波段的时间
TIM定时器:共有四个
分频系数:将时钟源的频率降低,方便低速设备时钟选择,
比如你的晶振是10M,定时器的计数器是65535,如果没有分频器,只能计时65535/10000000=6.5毫秒
如果有了分频器,2分频,定时长度就变为2倍了,当然精度也下降了

posted @   MAOCE  阅读(57)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示