一、驱动电机模块

二、程序
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "IC.h"
#include "Motor.h"
#include "OLED.h"
#include "KEY.h"
int16_t num=500,i=3,j=4,count1=1;
int16_t speed1=0,speed2=0,mode=0;
int main()
{
OLED_Init();
Motor_Init();
IC_Init();
Key_Init();
Motor_SetFreq(36-1);//频率=72M / (PSC + 1) / 100
Motor_Speed(50);//占空比 Duty = CCR / 100
Motor_Rotate(mode);
OLED_ShowString(1,1,"Freq:000000HZ");
OLED_ShowString(2,1,"Duty:00000");
OLED_ShowString(3,1,"Mode1:000");
OLED_ShowString(4,1,"Mode2:000");
while(1)
{
num=Get_KeyNum();
OLED_ShowString(j,13," ");
OLED_ShowString(i,13,"<-");
if(num==2)
{
count1++;
if(count1>2)
{
j=3;
i=4;
count1=1;
}
else
{
j=4;
i=3;
}
}
else if(num==3)
{
if(i==3&&j==4)
{
speed1+=20;
if(speed1>100)
{
speed1=0;
}
}
else if(i==4&&j==3)
{
speed2+=20;
if(speed2>100)
{
speed2=0;
}
}
}
else if(num==4)
{
if(i==3&&j==4)
{
if(speed1>0)
{
mode=1;
Motor_Rotate(mode);
Motor_Speed(speed1);
}
else
{
mode=0;
Motor_Rotate(mode);
}
}
else if(i==4&&j==3)
{
if(speed1>0)
{
mode=2;
Motor_Rotate(mode);
Motor_Speed(speed2);
}
else
{
mode=0;
Motor_Rotate(mode);
}
}
}
OLED_ShowNum(3,7,speed1,3);
OLED_ShowNum(4,7,speed2,3);
OLED_ShowNum(1,6,IC_GetFreq(),6);
OLED_ShowNum(2,6,IC_GetDuty(),5);
}
}
KEY.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
void Key_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//启动时钟
GPIO_InitTypeDef GPIO_KeyInit;
GPIO_KeyInit.GPIO_Mode=GPIO_Mode_IPU;
GPIO_KeyInit.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_14|GPIO_Pin_15;//引用GPIOB的12,14,15,作为按键输入
GPIO_KeyInit.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_KeyInit);
}
uint8_t Get_KeyNum(void)
{
uint8_t keynum=0;
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==0)
{
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==0);
Delay_ms(20);
keynum=2;
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0)
{
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0);
Delay_ms(20);
keynum=3;
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0)
{
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0);
Delay_ms(20);
keynum=4;
}
return keynum;
}
Motor.c
#include "stm32f10x.h" // Device header
void Motor_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef PWM_GPIOInitStcructer;
PWM_GPIOInitStcructer.GPIO_Mode=GPIO_Mode_AF_PP;
PWM_GPIOInitStcructer.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
PWM_GPIOInitStcructer.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&PWM_GPIOInitStcructer);
GPIO_InitTypeDef PWM_GPIOBInitStcructer;
PWM_GPIOBInitStcructer.GPIO_Mode=GPIO_Mode_Out_PP;
PWM_GPIOBInitStcructer.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
PWM_GPIOBInitStcructer.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&PWM_GPIOBInitStcructer);
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitTypeDef Motor_InitStructure;
Motor_InitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
Motor_InitStructure.TIM_CounterMode=TIM_CounterMode_Up;
Motor_InitStructure.TIM_Period=100-1;
Motor_InitStructure.TIM_RepetitionCounter=0;
Motor_InitStructure.TIM_Prescaler=36-1;
TIM_TimeBaseInit(TIM2,&Motor_InitStructure);
TIM_OCInitTypeDef Motor_OCInitStructure;
TIM_OCStructInit(&Motor_OCInitStructure);
Motor_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
Motor_OCInitStructure.TIM_Pulse=0;
Motor_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
Motor_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OC1Init(TIM2,&Motor_OCInitStructure);
TIM_Cmd(TIM2,ENABLE);
}
void Motor_Speed(uint16_t Compare)//占空比
{
TIM_SetCompare1(TIM2, Compare);
}
void Motor_SetFreq(uint16_t Freq)//频率
{
TIM_PrescalerConfig(TIM2,Freq,TIM_PSCReloadMode_Update);
}
void Motor_Rotate(uint16_t Rotate)
{
if(Rotate==1)//正转
{
GPIO_SetBits(GPIOB,GPIO_Pin_0);
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
}
else if(Rotate==2)//fan转
{
GPIO_SetBits(GPIOB,GPIO_Pin_1);
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
}
else if(Rotate==0)//制动
{
GPIO_SetBits(GPIOB,GPIO_Pin_0);
GPIO_SetBits(GPIOB,GPIO_Pin_1);
}
}
IC.c
#include "stm32f10x.h" // Device header
void IC_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef IC_GPIOStructer;
IC_GPIOStructer.GPIO_Mode=GPIO_Mode_IPU;
IC_GPIOStructer.GPIO_Pin=GPIO_Pin_6;
IC_GPIOStructer.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&IC_GPIOStructer);
TIM_InternalClockConfig(TIM3);
TIM_TimeBaseInitTypeDef IC_TimeStructer;
IC_TimeStructer.TIM_ClockDivision=TIM_CKD_DIV1;
IC_TimeStructer.TIM_CounterMode=TIM_CounterMode_Up;
IC_TimeStructer.TIM_Period=65536-1;//arr
IC_TimeStructer.TIM_Prescaler=72-1;
IC_TimeStructer.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM3,&IC_TimeStructer);
TIM_ICInitTypeDef IC_InitStructer;
IC_InitStructer.TIM_Channel=TIM_Channel_1;//通道选择
IC_InitStructer.TIM_ICFilter=0XF;//滤波效果
IC_InitStructer.TIM_ICPolarity=TIM_ICPolarity_Rising;//极性选择
IC_InitStructer.TIM_ICPrescaler=TIM_ICPSC_DIV1;//选择第几次捕获
IC_InitStructer.TIM_ICSelection=TIM_ICSelection_DirectTI;//直连
TIM_PWMIConfig(TIM3,&IC_InitStructer);
TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
TIM_Cmd(TIM3,ENABLE);
}
uint32_t IC_GetFreq(void)
{
return 1000000/(TIM_GetCapture1(TIM3)+1);
}
uint32_t IC_GetDuty(void)
{
return (TIM_GetCapture2(TIM3)+1)*100/(TIM_GetCapture1(TIM3)+1);
}
三、成果展示
四、待解决问题
当速度设置为100,占空比只能停留在80;