dcmotor.c=dcmotor.h==20220327

Go_Viola

关注

阅读 9

2022-03-30


#include "htimx.h"
#include "dcmotor.h"

void DCMotor1Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);//使能 GPIOd 时钟
//GPIOF9,F10 初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11| GPIO_Pin_10;//LED0 和 LED1 对应 IO 口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化 GPIO
GPIO_SetBits(GPIOD,GPIO_Pin_11 | GPIO_Pin_10);//GPIOF9,F10 设置高,灯灭
}

//*****************************++++++++++++++++..............motor2
//e11 pwm-tim1-ch2-----
//d0
//d1
void DCMotor2Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能 GPIOd 时钟
//GPIOF9,F10 初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14| GPIO_Pin_15;//LED0 和 LED1 对应 IO 口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化 GPIO

GPIO_SetBits(GPIOB,GPIO_Pin_14 | GPIO_Pin_15);//GPIOF9,F10 设置高,灯灭

//TIM1_PWM_Init(arr,psc);//设定pwm的频率是500--4k
}




//************************************************************ motor3
void DCMotor3Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);//使能 GPIOd 时钟
//GPIOF9,F10 初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;//LED0 和 LED1 对应 IO 口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化 GPIO

GPIO_SetBits(GPIOD,GPIO_Pin_2| GPIO_Pin_3);//GPIOF9,F10 设置高,灯灭

}
//**************************************************motor4
void DCMotor4Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);//使能 GPIOd 时钟
//GPIOF9,F10 初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1;//LED0 和 LED1 对应 IO 口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化 GPIO

GPIO_SetBits(GPIOD,GPIO_Pin_0 | GPIO_Pin_1);//GPIOF9,F10 设置高,灯灭
}


void set_clockwise_rotate(u8 whichmotor)
{
switch(whichmotor)
{
case 1:
Motor1_set_clockwise_rotate();
break;

case 2:
Motor2_set_clockwise_rotate();
break;

case 3:
Motor3_set_clockwise_rotate();
break;

case 4:
Motor4_set_clockwise_rotate();
break;

}

}

void set_anticlockwise_rotate(u8 whichmotor)
{

switch(whichmotor)
{
case 1:
Motor1_set_anticlockwise_rotate();
break;

case 2:
Motor2_set_anticlockwise_rotate();
break;

case 3:
Motor3_set_anticlockwise_rotate();
break;

case 4:
Motor4_set_anticlockwise_rotate();
break;

}
}

void set_stop_rotate(u8 whichmotor)
{
switch(whichmotor)
{
case 1:
Motor1_set_stop_rotate();
break;

case 2:
Motor2_set_stop_rotate();
break;

case 3:
Motor3_set_stop_rotate();
break;

case 4:
Motor4_set_stop_rotate();
break;

}
}


void SetDCmotorPwmDuty(u8 whichmotor,float DutyTemp)
{
u32 cnx=0;
if(DutyTemp < 0 || DutyTemp > Global_Timer1_Arr)
{
return; /*只能是0~100*/
}
cnx=DutyTemp*Global_Timer1_Arr;
switch(whichmotor)
{
case 1:
TIM_SetCompare3(TIM1,cnx);
//Motor1_set_rotatePWM(TIM1,pwm);
break;
case 2:
TIM_SetCompare4(TIM1,cnx);
break;

case 3:
TIM_SetCompare1(TIM1,cnx);
break;
case 4:
TIM_SetCompare2(TIM1,cnx);
break;
}

}

void set_pwm(u8 whichmotor,int pwm)
{
if(pwm < 0 || pwm > Global_Timer1_Arr)
{
return; /*只能是0~100*/
}

switch(whichmotor)
{
case 1:
TIM_SetCompare3(TIM1,pwm);
//Motor1_set_rotatePWM(TIM1,pwm);
break;
case 2:
TIM_SetCompare4(TIM1,pwm);
break;

case 3:
TIM_SetCompare1(TIM1,pwm);
break;
case 4:
TIM_SetCompare2(TIM1,pwm);
break;
}

}

void set_motor_rotate(u8 whichmotor,int pwm)
{
switch(whichmotor)
{
case 1:
if(pwm > 0)
{
set_pwm(1,pwm);
// set_pwm(1,pwm);
set_clockwise_rotate(1);
}
else if(pwm < 0)
{
set_pwm(1,-pwm);
// set_pwm(1,-pwm);
set_anticlockwise_rotate(1);
}
else
{
set_pwm(1,0);
set_stop_rotate(1);
}
break;


case 2:
if(pwm > 0)
{
set_pwm(2,pwm);
// set_pwm(1,pwm);
set_clockwise_rotate(2);
}
else if(pwm < 0)
{
set_pwm(2,-pwm);
// set_pwm(1,-pwm);
set_anticlockwise_rotate(2);
}
else
{
set_pwm(2,0);
set_stop_rotate(2);
}

break;

case 3:
if(pwm > 0)
{
set_pwm(3,pwm);
set_clockwise_rotate(3);
}
else if(pwm < 0)
{
set_pwm(3,-pwm);
set_anticlockwise_rotate(3);
}
else
{
set_pwm(3,0);
set_stop_rotate(3);
}
break;

case 4:
if(pwm > 0)
{
set_pwm(4,pwm);
set_clockwise_rotate(4);
}
else if(pwm < 0)
{
set_pwm(4,-pwm);
set_anticlockwise_rotate(4);
}
else
{
set_pwm(4,0);
set_stop_rotate(4);
}
break;

}

TIM_Cmd(TIM1, ENABLE); //使能TIM1
TIM_CtrlPWMOutputs(TIM1, ENABLE);

}

void SetDCmotor_rotate(u8 whichmotor,float pwm)
{
switch(whichmotor)
{
case 1:
if(pwm > 0)
{
SetDCmotorPwmDuty(1,pwm);
// set_pwm(1,pwm);
set_clockwise_rotate(1);
}
else if(pwm < 0)
{
SetDCmotorPwmDuty(1,-pwm);
// set_pwm(1,-pwm);
set_anticlockwise_rotate(1);
}
else
{
SetDCmotorPwmDuty(1,0);
set_stop_rotate(1);
}
break;


case 2:
if(pwm > 0)
{
SetDCmotorPwmDuty(2,pwm);
// set_pwm(1,pwm);
set_clockwise_rotate(2);
}
else if(pwm < 0)
{
SetDCmotorPwmDuty(2,-pwm);
// set_pwm(1,-pwm);
set_anticlockwise_rotate(2);
}
else
{
SetDCmotorPwmDuty(2,0);
set_stop_rotate(2);
}

break;

case 3:
if(pwm > 0)
{
SetDCmotorPwmDuty(3,pwm);
set_clockwise_rotate(3);
}
else if(pwm < 0)
{
SetDCmotorPwmDuty(3,-pwm);
set_anticlockwise_rotate(3);
}
else
{
SetDCmotorPwmDuty(3,0);
set_stop_rotate(3);
}
break;

case 4:
if(pwm > 0)
{
SetDCmotorPwmDuty(4,pwm);
set_clockwise_rotate(4);
}
else if(pwm < 0)
{
SetDCmotorPwmDuty(4,-pwm);
set_anticlockwise_rotate(4);
}
else
{
SetDCmotorPwmDuty(4,0);
set_stop_rotate(4);
}
break;

}

TIM_Cmd(TIM1, ENABLE); //使能TIM1
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}

**

dcmotor.h

**

/*
明确目的:控制四路直流电机
定时器1,产生PWM
控制正转,反转,以及速度
速度用PWM的占空比控制
方向用01 10 11 00控制,类似LED灯控制高低电平
主要是这个作为应用层,封装要贴合工程的应用,使用方便,修改方便,维护方便
*/

#ifndef __DCMOTOR_H
#define __DCMOTOR_H

#include "sys.h"
//直流电机端口定义
//是定时器器1的设置,用定时器1产生PWM,控制直流电机
//设置的说明:设置定时器的计时滴答是1us,由于是控制直流电机,所以可以设置PWM频率是10K左右;
//PWM2模式(注意,如果是PWM1模式,是从1电平翻转到0电平,如果PMW2,就是0电平翻转到1电平)
//经过测试,是调到PWM2模式,不然就是相反状态,用逻辑分析仪进行观察波形
//按照原理图,利用的是GPIO引脚
//PE9--T1CH1---P3接线端口---D2/D3
//PE11-T1CH2---P4接线端口---D0/D1
//PE13-T1CH3---P1接线端口---D11/D10
//PE14-T1CH4---P2接线端口---B14/B15

//e13 pwm-tim1-ch3-----------接口端子的P1口,M-5V-B7-B6-GND-M--tim4
//d11
//d10...正交编码使用定时器4
#define DCMotor1 1
#define M1PIN0 PDout(11) // DS0
#define M1PIN1 PDout(10)// DS1


//e14 pwm-tim1-ch4-----------接口端子的P2口,M-5V-A1-A0-GND-M--tim5
//b14
//b15=====使用定时器5
#define DCMotor2 2
#define M2PIN0 PBout(15) // DS0
#define M2PIN1 PBout(14)// DS1
//电机1的 e9 端口定义 D2 D3------接口端子的P3口,M-5V-B3-A15-GND-M--
//============使用定时器2
#define DCMotor3 3
#define M3PIN0 PDout(3) // DS0
#define M3PIN1 PDout(2)// DS1

//e11 pwm-tim1-ch2-----------接口端子的P4口,M-5V-B5-B4-GND-M---tim3
//d0
//d1==========使用定时器3
#define DCMotor4 4
#define M4PIN0 PDout(0) // DS0
#define M4PIN1 PDout(1)// DS1

#define Motor1_set_clockwise_rotate() {M1PIN0=1;M1PIN1=0;}//电机1正转
#define Motor2_set_clockwise_rotate() {M2PIN0=1;M2PIN1=0;}//电机2正转
#define Motor3_set_clockwise_rotate() {M3PIN0=1;M3PIN1=0;}//电机3正转
#define Motor4_set_clockwise_rotate() {M4PIN0=1;M4PIN1=0;}//电机4正转

#define Motor1_set_anticlockwise_rotate() {M1PIN0=0;M1PIN1=1;}//电机1反转
#define Motor2_set_anticlockwise_rotate() {M2PIN0=0;M2PIN1=1;}//电机2反转
#define Motor3_set_anticlockwise_rotate() {M3PIN0=0;M3PIN1=1;}//电机3反转
#define Motor4_set_anticlockwise_rotate() {M4PIN0=0;M4PIN1=1;}//电机4反转

#define Motor1_set_stop_rotate() {M1PIN0=0;M1PIN1=0;}//电机停止
#define Motor2_set_stop_rotate() {M2PIN0=0;M2PIN1=0;}//电机停止
#define Motor3_set_stop_rotate() {M3PIN0=0;M3PIN1=0;}//电机停止
#define Motor4_set_stop_rotate() {M4PIN0=0;M4PIN1=0;}//电机停止

#define Motor1_set_rotatePWM TIM_SetCompare3 //电机
#define Motor2_set_rotatePWM TIM_SetCompare4 //电机
#define Motor3_set_rotatePWM TIM_SetCompare1 //电机
#define Motor4_set_rotatePWM TIM_SetCompare2 //电机


void DCMotor1Init(void);
void DCMotor2Init(void);
void DCMotor3Init(void);
void DCMotor4Init(void);

void set_clockwise_rotate(u8 whichmotor);
void set_anticlockwise_rotate(u8 whichmotor);
void set_stop_rotate(u8 whichmotor);
void set_pwm(u8 whichmotor,int pwm);

void SetDCmotorPwmDuty(u8 whichmotor,float DutyTemp);

//主要函数使用
//whichmotor: =1,电机1,=2,电机2;=3电机3,=4电机4
//pwm:PWM:-100 - 100之间,小于0反转,等于0停止,大于0正转
void set_motor_rotate(u8 whichmotor,int pwm);

void SetDCmotor_rotate(u8 whichmotor,float pwm);

#endif



精彩评论(0)

0 0 举报