一、void sensorsTask(void *param)
二、void sensorsInit(void)//传感器初始化
1. sensorsDeviceInit();//传感器器件初始化
2.sensorsInterruptInit(); /*传感器中断初始化*/
3、 sensorsSetupSlaveRead();/*设置传感器从模式读取*/
4、任务主循环: 主要是进行数据获取 然后单位转换 最后进行二阶滤波 放入数据队列
5.1 void sensorsTask(void *param);
5.1.2 processAccGyroMeasurements数据处理函数
前言
对MiniFly进行学习
(8/10)sensorsTask; /*传感器处理任务*/(未完成)
一、void sensorsTask(void *param)
二、void sensorsInit(void)//传感器初始化
void sensorsInit(void)
{
if(isInit) return;
sensorsDataReady = xSemaphoreCreateBinary();/*传感器就绪信号量*/
sensorsBiasObjInit(&gyroBiasRunning);//创建了1024组3轴数据缓冲区用于计算偏置
sensorsDeviceInit(); /*器件初始化*/
sensorsInterruptInit(); /*中断初始化*/
isInit = true;
}
typedef struct
{
Axis3f bias;
bool isBiasValueFound;
bool isBufferFilled;
Axis3i16* bufHead;
Axis3i16 buffer[SENSORS_NBR_OF_BIAS_SAMPLES];
}BiasObj;
//应该是要用1024组 Axis3i16 数据计算出偏差值 赋值 给Axis3f
1. sensorsDeviceInit();//传感器器件初始化
2.sensorsInterruptInit(); /*传感器中断初始化*/
static void sensorsInterruptInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
/*定义了GPIO结构体 定义了外部中断结构体*/
/*定义了GPIOA 4 为输入模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*中断线*/
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource4);
/*配置中断线 中断模式 上升沿触发*/
EXTI_InitStructure.EXTI_Line = EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
portDISABLE_INTERRUPTS();
EXTI_Init(&EXTI_InitStructure);
EXTI_ClearITPendingBit(EXTI_Line4);
portENABLE_INTERRUPTS();
}
3、sensorsSetupSlaveRead();/*设置传感器从模式读取*/
4、任务主循环: 主要是进行数据获取 然后单位转换 最后进行二阶滤波 放入数据队列
while (1)
{
if (pdTRUE == xSemaphoreTake(sensorsDataReady, portMAX_DELAY))
{
/*确定数据长度*/
u8 dataLen = (u8) (SENSORS_MPU6500_BUFF_LEN +
(isMagPresent ? SENSORS_MAG_BUFF_LEN : 0) +
(isBaroPresent ? SENSORS_BARO_BUFF_LEN : 0));
i2cdevRead(I2C1_DEV, MPU6500_ADDRESS_AD0_HIGH, MPU6500_RA_ACCEL_XOUT_H, dataLen, buffer);
/*处理原始数据并放入数据队列中*/
processAccGyroMeasurements(&(buffer[0]));
if (isMagPresent)
{
processMagnetometerMeasurements(&(buffer[SENSORS_MPU6500_BUFF_LEN]));
}
if (isBaroPresent)
{
processBarometerMeasurements(&(buffer[isMagPresent ?
SENSORS_MPU6500_BUFF_LEN + SENSORS_MAG_BUFF_LEN : SENSORS_MPU6500_BUFF_LEN]));
}
vTaskSuspendAll(); /*确保同一时刻把数据放入队列中*/
xQueueOverwrite(accelerometerDataQueue, &sensors.acc);
xQueueOverwrite(gyroDataQueue, &sensors.gyro);
if (isMagPresent)
{
xQueueOverwrite(magnetometerDataQueue, &sensors.mag);
}
if (isBaroPresent)
{
xQueueOverwrite(barometerDataQueue, &sensors.baro);
}
xTaskResumeAll();/*恢复任务调度器*/
}
}
三、由于要进行移植 进行的二次学习
学习目标:
① 以MiniFLy 上面的陀螺仪为基准学习(先不要磁力计和气压计)
②学习陀螺仪的配置 重点是中断 和 各个数据的读取寄存器和读取方式
③进行队列的配置 数据到队列的读取
学习步骤:
以sensor.h中的函数为顺序一步一步进行学习
结合CSDN visio上画出流程图
①按顺序学习函数 并思考如何封装接口
5.1 void sensorsTask(void *param);
5.1.1 sensorsTask中读取数据的关键函数
sensorsInit();
sensorsSetupSlaveRead();
i2cdevRead(I2C1_DEV, MPU6500_ADDRESS_AD0_HIGH, MPU6500_RA_ACCEL_XOUT_H, dataLen, buffer);//将数据读取到文件初定义的buffer结构体中
processAccGyroMeasurements(&(buffer[0]));//最终滤波加上偏置后数据存储在文件初的sensors 结构体中
vTaskSuspendAll(); /*确保同一时刻把数据放入队列中*/(为什么实现了?暂停了任务调度 顺序写入后在恢复任务调度)
xQueueOverwrite(accelerometerDataQueue, &sensors.acc);
xQueueOverwrite(gyroDataQueue, &sensors.gyro); 写入队列 队列数据是全局使用的吗 可以用usart测试一下
5.1.2 processAccGyroMeasurements数据处理函数
①得到数据
int16_t ay = (((int16_t) buffer[0]) << 8) | buffer[1];
int16_t ax = ((((int16_t) buffer[2]) << 8) | buffer[3]);
int16_t az = (((int16_t) buffer[4]) << 8) | buffer[5];
int16_t gy = (((int16_t) buffer[8]) << 8) | buffer[9];
int16_t gx = (((int16_t) buffer[10]) << 8) | buffer[11];
int16_t gz = (((int16_t) buffer[12]) << 8) | buffer[13];
accRaw.x = ax;
accRaw.y = ay;
accRaw.z = az;
gyroRaw.x = gx - gyroBias.x;
gyroRaw.y = gy - gyroBias.y;
gyroRaw.z = gz - gyroBias.z;
②计算方差偏置
gyroBiasFound = processGyroBias(gx, gy, gz, &gyroBias);
③传入sensors数据进行滤波 param1是低通滤波的滤波参数
applyAxis3fLpf(gyroLpf, &sensors.gyro); //传入的是指针 输出的数据结构体仍然是 sensor.
注:.h文件中的函数 是为了外部其他函数调用的。如果只是在.c文件中调用的话就不用写到.h函数当中了。
所以看.c文件应该中主要的函数开始看,然后了解其中本.c文件中的函数。
最后看.h函数中提供了一些什么其他必要的函数功能接口。
总结