电机模块驱动

 

 

//初始化TIMX,设置TIMx的ARR,PSC
//arr:自动重装载初值,psc为预分频值,两者配合控制定时器时钟的周期
//定时器选择TIM1
static void TB6612_ADVANCE_TIM1_Mode_Config(TIM_TypeDef* TIMx,uint16_t arr,uint16_t psc,uint16_t duty)
 {
     //-----------------时基结构体初始化-------------------------/
     TIM_TimeBaseInitTypeDef TIM_TimeStructure;
     /*开启定时器1时钟,即内部时钟CK_INT=72M*/
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
    TIM_DeInit(TIMx);
    /*内部时钟作为计数器时钟,72MHZ*/
    TIM_InternalClockConfig(TIMx);
    /*自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断*/
    TIM_TimeStructure.TIM_Period=arr;
    /*时钟预分频系数为71,则驱动计数器的时钟CK_CNT=CK_INT/(71+1)=1MHZ*/
    TIM_TimeStructure.TIM_Prescaler=psc-1;
    /*设置时钟分割,TIM_CKD_DIV1=0,PWM波不延时*/
    TIM_TimeStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    /*向上计数模式*/
    TIM_TimeStructure.TIM_CounterMode=TIM_CounterMode_Up;
    /*重复计数器*/
    TIM_TimeStructure.TIM_RepetitionCounter=0;
    /*初始化定时器*/
    TIM_TimeBaseInit(TIMx,&TIM_TimeStructure);
    /*使能ARR预装载寄存器(影子寄存器)*/
    TIM_ARRPreloadConfig(TIMx,ENABLE);
    //-----------------输出比较结构体初始化-----------------------/
    TIM_OCInitTypeDef   TIM_OCInitStructure;
    /*PWM模式设置,设置为PWM模式1*/
    TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
    /*PWM输出使能相应的IO口输出信号*/
    TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
    /*设置占空比大小,CCR1[15:0]: 捕获/比较通道1的值,若CC1通道配置为输出:CCR1包含了装入当前捕获/比较1寄存器的值(预装载值)。*/
    TIM_OCInitStructure.TIM_Pulse=duty;
    /*输出通道电平极性设置*/
    TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
    /*初始化输出比较参数*/
    TIM_OC1Init(TIMx,&TIM_OCInitStructure);//初始化TIM1 通道1
    TIM_OC2Init(TIMx,&TIM_OCInitStructure);//初始化TIM1 通道2
    TIM_OC3Init(TIMx,&TIM_OCInitStructure);//初始化TIM1 通道3
    TIM_OC4Init(TIMx,&TIM_OCInitStructure);//初始化TIM1 通道4
    /*自动重装载*/
    TIM_OC1PreloadConfig(TIMx,TIM_OCPreload_Enable);
    TIM_OC2PreloadConfig(TIMx,TIM_OCPreload_Enable);
    TIM_OC3PreloadConfig(TIMx,TIM_OCPreload_Enable);
    TIM_OC4PreloadConfig(TIMx,TIM_OCPreload_Enable);
    /*使能计数器*/
    TIM_Cmd(TIMx,ENABLE);
    /*主输出使能,如果设置了相应的使能位(TIMx_CCER寄存器的CCxE、CCxNE位),则开启OC和OCN输出。*/
    TIM_CtrlPWMOutputs(TIMx,ENABLE);    
}
//高级定时器输出通道初始化函数
static void TB6612_ADVANCE_TIM_Gpio_Config()
{
    GPIO_InitTypeDef  GPIO_InitStruct;
    /*----------通道1配置--------------*/
    /*定时器1输出比较通道*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    /*配置为复用推挽输出*/
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStruct);
    /*-----------通道二配置-------------*/
    /*定时器1输出比较通道*/
    /*配置为复用推挽输出*/
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_11;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStruct);
     /*-----------通道三配置-------------*/
    /*定时器1输出比较通道*/
    /*配置为复用推挽输出*/
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStruct);
     /*-----------通道四配置-------------*/
    /*定时器1输出比较通道*/
    /*配置为复用推挽输出*/
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStruct);
}
————————————————
版权声明:本文为CSDN博主「果果小师弟」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39400113/article/details/104063037

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值