定时器中断和其余配置
现在我们所有相关的函数和控制代码都写了,剩下就只差把所有函数用起来就行
代码如下
/*
------------------------------------------------------------------------
| 文件名 :main.c
| 文件描述 :这个是初始的main.c,此时我们只是在里面使用我们所写的几个初始话函数初始化数据
| 作者 : pinocchio
| 创建时间 :19.4.26
------------------------------------------------------------------------
修改日期 :19.4.26
修改人 :pinocchio
------------------------------------------------------------------------
**************************************************************************
* 1. 本代码基于STM32F427IIH(2018RM开发板A型)开发,编译环境为keil
* 2. 本代码只适用于倒立摆,不建议用于其他用途
* 3.本代码最终解释权归哈尔滨工业大学(深圳)所有
* 4.请勿转载!!!!!!!!!!!
*
* Copyright (c) 2019 2019哈尔滨工业大学(深圳) 版权所有
**************************************************************************
*/
//首先是包含我们所写的几个头文件
//所以在头文件位置写下
#include "encoder.h"
#include "motor.h"
//然后就需要在int main(void)函数里写初始化
encoder_init();
size_init();
motor_init();
//这个是我们所写的几个初始化函数,初始相关的所有数据
//然后就要写hal库相关的初始化,因为定时器之类的中断不是在cube使能后就能用的,还需要在mian.c中调用使能函数
HAL_TIM_Base_Start_IT(&htim4);
HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_1);
//以上两个都是时钟使能函数,只有使能了才会跳到定时器中断
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
然后在mian.c文件里的改动就完成了
接下来就是写一个函数专门放中断函数(中断函数可以放在任意.c文件中,但是为了方便调试和使用,我们专门写一个函数ALL_interrupt.c来调用)
/*
------------------------------------------------------------------------
| 文件名 :ALL_interrupt.c
| 文件描述 :用于中断函数集合
| 作者 : pinocchio
| 创建时间 :19.4.26
------------------------------------------------------------------------
修改日期 :19.4.26
修改人 :pinocchio
------------------------------------------------------------------------
**************************************************************************
* 1. 本代码基于STM32F427IIH(2018RM开发板A型)开发,编译环境为keil
* 2. 本代码只适用于倒立摆,不建议用于其他用途
* 3.本代码最终解释权归哈尔滨工业大学(深圳)所有
* 4.请勿转载!!!!!!!!!!!
*
* Copyright (c) 2019 2019哈尔滨工业大学(深圳) 版权所有
**************************************************************************
*/
#include "main.h"
#include "tim.h"
#include "encoder.h"
#include "gpio.h"
#include "motor.h"
int tim_i;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{ //该函数每个定时器设置的周期都会执行一次
if (htim == (&htim4))
{
encoder_data_process();
auto_rotate();
motor_transmit();
//读取数据
//这里之所以把电机发送函数写在编码器对应定时器是因为一旦定时器一旦选择PWM模式
//就不会进入周期中断回调,而且之前cube预分频时已经确定定时器4是1ms的周期
//就是每过1ms就进入一次这个函数,所以就可以确定时间
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{ //该函数每当编码器发来一个高电平就执行一次
if (htim == (&htim4))
{
encoder_add();
//计算高电平次数(对应于时间)
}
}
然后我们的代码就写完了
注
1.由于才刚写完,实测可以调,但是应该还会有bug
2.就是由于该倒立摆的运动方程难以列写,所以可以直接pid调(最无脑的方法),目前是比较想要使用动态pid进行调试,还没有测试,如果成功会后期更新
3.对于步进电机,步进电机驱动器切记是需要调步距角的,我们所选的模式是1600,也就是1600个高电平对应一圈
如果调太高速度会受限制,但是当调制低速时不容易抖动(如果抖动大的朋友可以试试这个)
调太高速度快,但是低速时会不停的抖动
4,如果有什么问题可以私信我