PWM 输出 占空比信号控制 sg90舵机 转动

目录

1 pwm的简介

2pwm的工作原理

3pwm的所需的硬件

4 代码配置

1 pwm的简介  

pwm:脉冲宽度调制 就是利用数字输出对模拟地电路的的控制 ,简单点就是 对脉宽的控制 

2 pwm的工作原理 

  在上面的图 我们可以看到在y轴 有 三个数据   一个是 cnt(计数值 )CCRX(比较值)ARR(自动重装载值 )  我们用的是定时器的向上计数 这里就不讲了 直接进入正题。

因为我们的pwm占空比时间 是通过 DAC 转换 才可以得到 舵机的转动 所以 在y的下半轴会有 0和1 的出现   不能理解这个知识点  在后面会体现出来 不用着急  现在我来解析一下这个图 会出现的情况   1 当CCRX<CNT 时 并且是使用向上计数的模式   通道就会输出 数字信号1  反之就是 输出 数字信号0   2 自动重装载值确定 频率 CCRX 确定占空比信号   占空比:就是 一个周期内高电平持续的所占总时间比例 

 

3 pwm的所需的硬件和下载软件   

 

一个 祖传的 c8t6  一个是 SG90 舵ji   下载器   RX接 PA9  TX接PA10 这样就实现了串联 通讯

下载器的配置  红色款款都是需要注意的地方  最后一个 下载注意的地方

 4 代码配置

void PwmMotor_init(void)
{

		GPIO_InitTypeDef GPIO_InitStruct;
		TIM_TimeBaseInitTypeDef TIMPwm_TimeBaseInitStruct;
		TIM_OCInitTypeDef TIMPwm_OCInitStruct;
		// GPIO ʱÖÓ ¶¨Ê±Æ÷ʱÖÓ  PWM ¸´Óà ʱÖÓ 

		RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB,ENABLE);
		RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3,ENABLE);
		RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO,ENABLE);
		
		GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);//部分重映射 使能 

		GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出 
		GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;
		GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
		GPIO_Init(GPIOB,&GPIO_InitStruct);

		// 定时器 配置  arr psc   向上计数 
		TIMPwm_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//一分频 就是 没有分频 
		TIMPwm_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上计数 
		TIMPwm_TimeBaseInitStruct.TIM_Period=200-1;//自动重装载值
		TIMPwm_TimeBaseInitStruct.TIM_Prescaler=7200-1;//预分频系数
																									 
		TIM_TimeBaseInit(TIM3,&TIMPwm_TimeBaseInitStruct);//
		// PWM
		TIMPwm_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;//模式1
		TIMPwm_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable; 
		TIMPwm_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;// 输出数字信号为0 转为为模拟 
         信号 控制舵机
		TIM_OC2Init(TIM3,&TIMPwm_OCInitStruct);
		TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable );//预加载器使能 
		TIM_Cmd(TIM3,ENABLE); //最后使能定时器 


}

 

    pwm的代码我解释一下 因为我用的是 tim3 舵机接了 pb5  pb5 的口是部分重映射   所以我们在配置完 pwm模式  后 gpio的配置 多加一个pb5 的 定时器部分重映射的 使能函数     我在前面提到了为什么 用到DAC转换才能控制电机 我们首先要配置一个函数 可以使能他的模拟电路        TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable );   这是不可缺的一个步骤   

我这里回顾一下前面讲解的 大概 有几个核心要点  1  要知道  cnt和ccrx的关系  并且会得出什么的结果 2懂得周期和频率的关系 和相关计算     3知道dac转换的知识    D表示什么 A表示什么    占空比是什么   4 不要忘记使能模拟信号的函数   

 主函数部分  首先 定义一个变量  并赋值 变量就是比较值   比较值可以确定占空比的周期长度

设定了 200 最大的计数值   占空比就占了 (195-175)/200 =1/10 总的T=(200-1)*(7200-1)/72M=20MS     而占空比时间 就是 2ms  转动的角度有四个  一个角度持续的时间 就是 0.5ms

因为计数器的值 就是存入ARR 的  所以可以 说ARR就是CNT  CNT 固定了   CCRX的大小 不就是可以确定 占空比在周期时间的长短了吗      

感谢 阅读   下次见   !!!!!!!!!!!

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值