STM32学习(PWM驱动电机)

一、驱动电机模块

TB6612

二、程序

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值