基于DC3V-6V直流减速电机实验---战舰版F103开发

基于DC3V-6V直流减速电机实验—战舰版F103开发
(作为一个小小白,傻逼到烧程序都能放错文件,学一个小模块,写一个小文章都是一晚上的精华感悟噢嘻嘻,快乐!!!)
——TT130马达——
工作电压:3V~12V DC(建议工作电压在6V到8V左右)
最大扭矩:800gf
负载电流:70mA
基于DC3V-6V直流减速电机实验---战舰版F103开发_第1张图片
——L298N电机驱动版——
基于DC3V-6V直流减速电机实验---战舰版F103开发_第2张图片

1.驱动直流电机
由于本模块是2路的H桥驱动,所以可以同时驱动两个电机,使能ENA ENB之后,可以分别从IN1 IN2输入PWM信号驱动电机1的转速和方向。可以分别从IN3 IN4输入PWM信号驱动电机2的转速和方向。
信号如图所示;
基于DC3V-6V直流减速电机实验---战舰版F103开发_第3张图片

——实验连接图——
以电机正转为例
GPIO_SetBits(GPIOC,GPIO_Pin_0);
GPIO_ResetBits(GPIOC,GPIO_Pin_1);
由此可见PC1为低电平,PC0为高电平。
基于DC3V-6V直流减速电机实验---战舰版F103开发_第4张图片

——代码部分,以战舰f103开发——
main.c



int main(void)

 {
           

    u16 led0pwmval=0;

    u8 dir=1;   

    delay_init();            //延时函数初始化     

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
     //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

    uart_init(115200);   //串口初始化为115200

    LED_Init();             //LED端口初始化

    TIM3_PWM_Init(899,0);    //不分频。PWM频率=72000000/900=80Khz

      

     TIM_SetCompare2(TIM3,100);

     Motor_12_Config();

     GPIO_ResetBits(GPIOC,GPIO_Pin_4);

     while(1)

     {
     

         

   Motor_1_PRun();

        //Motor_1_STOP();

        //Motor_1_NRun();

         LED0=!LED0;

     delay_ms(500);

     }


 }

dianji



 

#include "dianji.h"

#include "stm32f10x.h" 

#include "stm32f10x_rcc.h"

#include "delay.h"

 

void Motor_12_Config(void)   //管脚配置

 {
     

 
GPIO_InitTypeDef GPIO_InitStructure; 


 
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);

 
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

 
GPIO_Init(GPIOC, &GPIO_InitStructure);

 
GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);


 }

 

 void Motor_1_STOP(void)              //电机1停止

{
     

 GPIO_ResetBits(GPIOC,GPIO_Pin_0);

 GPIO_ResetBits(GPIOC,GPIO_Pin_1);

}

 

void Motor_1_PRun(void)           //电机1正转

{
     

 GPIO_SetBits(GPIOC,GPIO_Pin_0);

 GPIO_ResetBits(GPIOC,GPIO_Pin_1);

}

 

void Motor_1_NRun(void)     //电机1反转

{
     

 GPIO_SetBits(GPIOC,GPIO_Pin_1);

 GPIO_ResetBits(GPIOC,GPIO_Pin_0);

}

初始化定时器3输出PWM波



void TIM3_PWM_Init(u16 arr,u16 psc)

{
       

    GPIO_InitTypeDef GPIO_InitStructure;

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    TIM_OCInitTypeDef  TIM_OCInitStructure;

    

 

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);    //使能定时器3时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

    

    GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE); //Timer3部分重映射  TIM3_CH2->PB5    

 

   //设置该引脚为复用输出功能,输出TIM3
CH2的PWM脉冲波形    GPIOC 7

    GPIO_InitStructure.GPIO_Pin= GPIO_Pin_7; //TIM_CH2

    GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP;  //复用推挽输出

    GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;

    GPIO_Init(GPIOC,&GPIO_InitStructure);//初始化GPIO

 

   //初始化TIM3

    TIM_TimeBaseStructure.TIM_Period= arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值

    TIM_TimeBaseStructure.TIM_Prescaler=psc; //设置用来作为TIMx时钟频率除数的预分频值 

    TIM_TimeBaseStructure.TIM_ClockDivision= 0; //设置时钟分割:TDTS =
Tck_tim

    TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Up;  //TIM向上计数模式

    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

    

    //初始化TIM3 Channel2 PWM模式   

    TIM_OCInitStructure.TIM_OCMode= TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2

    TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable; //比较输出使能

    TIM_OCInitStructure.TIM_OCPolarity= TIM_OCPolarity_High; //输出极性:TIM输出比较极性高

    TIM_OC2Init(TIM3,&TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3
OC2

 

    TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器

 

    TIM_Cmd(TIM3,ENABLE);  //使能TIM3

   
}

由此电机就可以旋转啦啦啦
感谢实验室学长的指正,面对引脚一直输入低电平真的很让人头疼,于是百转千回,终于发现我的下载文件搞错了哈哈。

一篇文章6小时,虽然操作不难,但是我还是很快乐哈哈。
如有错误望指正!!!

你可能感兴趣的:(单片机)