STM32的舵机的编写

#include "pwm.h"

/*
* 对电机的控制  
*  端口PB9
*    PWM    除了定时器6和7之外其他定时器都能产生PWM         
*    高级定时器1与8 -->7路        通用定时器2-5 -->4路
*    PSC :    预分频    16位  65536    ARR :自动重装载值    到达装载值响应中断或事件        
*    TIM_CCRx  改变占空比        占一个周期的多少    CCR/ARR的比值        ARR为周期最大值     遇到CCR切换电平
*    CNT为定时器 有递增  递减  中心(周期结束又从定时器的结束位退回)            //定时为一个周期
*    PWM1     递增   定时器递增  到CCR之前有效 高电平      到CCR之后无效  低电平   
*
*    配置步骤:
*   1.定时器时钟 复用AFIO  端口时钟
*    2.TIM3--PA7            PB5(重映射) GPIO_PinRemapCofig
*   3.端口模式        AF_PP 复用
*   4.定时器初始化
*   5.PWM参数配置   TIM_OCxTint(TIMx,&)
*   OCMOde        PWM1
*   Pulse      脉冲
*   OCP0      输出极性
*
*    目标    PB9   
*/


//自动重装在值,预频率系数
void TIM4_PWM_Init(u16 arr,u16 psc)
{
    GPIO_InitTypeDef GPIO_InitStrue;                                                //端口配置结构体
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;                                    //定时器结构体
    TIM_OCInitTypeDef TIM_OCInitStructure;                                            // 输出(OC)比较结构体(PWM)
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);        //开启端口B和复用时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);                            //开启定时器TIM4的时钟
    
    
//端口配置    选择通道
    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;                    //复用推挽
    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;                            //引脚
    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;                    //速度
    GPIO_Init(GPIOB,&GPIO_InitStrue);                            

//    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM4,ENABLE);                            //    TIM4 端口映射
    
    
//定时器配置     选择定时器 
    TIM_TimeBaseStructure.TIM_Period = arr;                             //周期值 ARR      最大值65535
    TIM_TimeBaseStructure.TIM_Prescaler =psc;                             //预分频率系数   时钟信号预分频才得到时钟信号  
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;                         //时钟分频 不分频  基本定时器没有
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;         //计数方式  向上计数    向下计数    中心对齐
//    TIM_TimeBaseStructure.TIM_RepetitionCounter                            //重复计数器  只用于高级定时器
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);                        //选择定时器  结构体 


//输出比较初始化  PWM 
    TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;                        //模式 PWM1 PWM1   
    TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;             //输出极性   到底时高为有效还是低电平有效
    TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;            // 使能 到IO口
    TIM_OC4Init(TIM4,&TIM_OCInitStructure);                            //4为通道    选择定时器 悬着结构体成员
    
    TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);                //使能  CCR 预装载值的寄存器
    TIM_Cmd(TIM4,ENABLE);                                        //开启定时器   定时器名 和使能
    
}

//    TIM_SetCompare4(TIM4,500);  //  舵机0度
//    TIM_SetCompare4(TIM4,1000);  //  舵机45度
//    TIM_SetCompare4(TIM4,1500);  // 舵机90度
//    TIM_SetCompare4(TIM4,1000);  // 舵机135度
//    TIM_SetCompare4(TIM4,2500);  // 舵机180度

//主函数调用
//1.初始化
//    TIM4_PWM_Init(500,72-1); //频率是2Kh  频率要适合  太快 太慢都不好     72/72=1us*500=0.5ms   PWM的输出频率

//2.发送信号
//        TIM_SetCompare2(TIM4,i);  //i值最大可以取499,因为ARR最大值是499.     修改占空比    参:定时器名  比较值
//CCR不能大于CNT计数器的值  大于会全部是高电平   即不会大于TIM3_CH2_PWM_Init(500,72-1) 中500值           
//这里的  i  为有效电平

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值