(8/10)sensorsTask; /*传感器处理任务*/(未完成)

 

前言

 

一、void sensorsTask(void *param)

 

二、void sensorsInit(void)//传感器初始化

1.    sensorsDeviceInit();//传感器器件初始化

2.sensorsInterruptInit();    /*传感器中断初始化*/

3、    sensorsSetupSlaveRead();/*设置传感器从模式读取*/

4、任务主循环: 主要是进行数据获取 然后单位转换 最后进行二阶滤波 放入数据队列

三、由于要进行移植 进行的二次学习

5.1 void sensorsTask(void *param);

5.1.1 sensorsTask中读取数据的关键函数

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函数中提供了一些什么其他必要的函数功能接口。

 


总结

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值