实验二:STM32平台-------小车前进实验
1、实验前准备
图1-1 STM32主控板
图1-2 STM32转向车
2、实验目的
STM32单片机上电之后,按下PS2标志旁边的启动按键后,实验效果为小车前进1s,停止1s,后退1s,停止。
3、实验原理
对于4路直流减速电机的控制我们采用的是74HC244驱动芯片和H桥驱动芯片来驱动电机。此模块中M1A和M1B控制一个电机,M2A和M2B控制一个电机,当M1A为0,M1B为1的时候电机正转,当M1A为1,M1B为0的时候电机反转,当两个都为0的时候电机停止。当M2A为0,M2B为1的时候电机正转,当M2A为1,M2B为0的时候电机反转,当两个都为0的时候电机停止。本次实验主要是控制M1A为低电平,M2A为低电平然后通过定时器改变M1B和M2B高低电平的占空比来控制电机的转速。
下面我们来讲下用定时器来控制电机的方法。
这里我们用定时器1来驱动电机,首先我们先开启TIM1时钟如下:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //时钟使能
然后对定时器1初始化如下:
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler = (psc-1); //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim //36Mhz
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //重复计数关闭
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
最后定义定时器更新中断:
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE ); //使能指定的TIM1中断,允许更新中断
//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; //TIM1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
最后使能定时器1:
TIM_Cmd(TIM1, ENABLE); //使能TIMx
void TIM1_Int_Init(u16 arr,u16 psc)
该函数的 2 个参数用来设置 TIM1 的溢出时间。 在前面时钟系统部分我们讲解过, 系统初始化的时候在默认的系统初始化函数 SystemInit 函数里面已经初始化 APB1 的时钟为 2 分频,所以 APB1 的时钟为 36M, 而从 STM32 的内部时钟树图得知:当 APB1 的时钟分频数为 1 的时候, TIM2~7 的时钟为 APB1 的时钟,而如果 APB1 的时钟分频数不为 1,那么 TIM2~7 的时钟频率将为 APB1 时钟的两倍。因此, TIM3 的时钟为 72M,再根据我们设计的 arr 和 psc 的值,就可以计算中断时间了。计算公式如下:
Tout= ((arr+1)*(psc+1))/Tclk;
其中:
Tclk: TIM1 的输入时钟频率(单位为 Mhz)。
Tout: TIM1 溢出时间(单位为 us)。
TIM1_Int_Init(9, 72);
这里我们设置溢出时间为: (9+1)*(71+1)/72M = 10us
4、实验步骤
4-1.看懂原理图
图4-1 STM32主控板电路图
图4-2 电机驱动芯片74HC244
4-2理解原理图
由图4-1和4-2 由电路原理图可知M1A,M1B,M2A,M2B,分别接在STM32主控板上的PB3,PD2,PC12 ,PC11。
4-3 核心程序代码如下
电机初始化
定时器1初始化
小车运动函数
定时器中断部分代码
初始化函数:
主函数: