v0.1
This commit is contained in:
@@ -385,6 +385,43 @@ void ABS_OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//z_len为整数显示位数,f_len为小数显示位数,size2为字体大小
|
||||
void ABS_OLED_Showdecimal(u8 x,u8 y,float num,u8 z_len,u8 f_len,u8 size2,u8 mode)
|
||||
{
|
||||
u8 t,temp;
|
||||
u8 enshow;
|
||||
int z_temp,f_temp;
|
||||
z_temp=(int)num;
|
||||
//整数部分
|
||||
for(t=0;t<z_len;t++)
|
||||
{
|
||||
temp=(z_temp/ABS_OLED_Pow(10,z_len-t-1))%10;
|
||||
if(enshow==0 && t<(z_len-1))
|
||||
{
|
||||
if(temp==0)
|
||||
{
|
||||
ABS_OLED_ShowChar(x+(size2/2)*t,y,' ',size2,mode);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
enshow=1;
|
||||
}
|
||||
ABS_OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2,mode);
|
||||
}
|
||||
//小数点
|
||||
ABS_OLED_ShowChar(x+(size2/2)*(z_len),y,'.',size2,mode);
|
||||
|
||||
f_temp=(int)((num-z_temp)*(ABS_OLED_Pow(10,f_len)));
|
||||
//小数部分
|
||||
for(t=0;t<f_len;t++)
|
||||
{
|
||||
temp=(f_temp/ABS_OLED_Pow(10,f_len-t-1))%10;
|
||||
ABS_OLED_ShowChar(x+(size2/2)*(t+z_len)+5,y,temp+'0',size2,mode);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*函数:ABS_OLED_ShowChinese
|
||||
**描述:在指定位置打印中文字符
|
||||
**参数1:x1:起始x坐标 取值返回小于ABS_OLED_WIDTH
|
||||
@@ -571,6 +608,7 @@ ABS_OLED_Drive Create_OLED(void){
|
||||
drive.ShowString=ABS_OLED_ShowString;
|
||||
drive.ShowChinese=ABS_OLED_ShowChinese;
|
||||
drive.ShowNum=ABS_OLED_ShowNum;
|
||||
drive.Showdecimal=ABS_OLED_Showdecimal;
|
||||
drive.ShowImage=ABS_OLED_ShowPicture;
|
||||
ABS_OLED_Init();
|
||||
return drive;
|
||||
|
||||
@@ -73,6 +73,7 @@
|
||||
typedef struct _ABS_OLED_Drive{
|
||||
void (*ShowString)(u8 x,u8 y,char *chr,u8 size1,u8 mode);
|
||||
void (*ShowNum)(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode);
|
||||
void (*Showdecimal)(u8 x,u8 y,float num,u8 z_len,u8 f_len,u8 size2,u8 mode);
|
||||
void (*ShowChinese)(u8 x,u8 y,u8 num,u8 size1,u8 mode);
|
||||
|
||||
void (*DrawPoint)(u8 x,u8 y,u8 t);
|
||||
@@ -129,6 +130,7 @@ void ABS_OLED_DrawCircle(u8 x,u8 y,u8 r);
|
||||
void ABS_OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode);
|
||||
void ABS_OLED_ShowString(u8 x,u8 y,char *chr,u8 size1,u8 mode);
|
||||
void ABS_OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode);
|
||||
void ABS_OLED_Showdecimal(u8 x,u8 y,float num,u8 z_len,u8 f_len,u8 size2,u8 mode);
|
||||
void ABS_OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 mode);
|
||||
void ABS_OLED_ScrollDisplay(u8 num,u8 space,u8 mode);
|
||||
void ABS_OLED_ShowPicture(u8 x,u8 y,u8 sizex,u8 sizey,u8 BMP[],u8 mode);
|
||||
|
||||
@@ -44,8 +44,9 @@ void MX_ADC1_Init(void)
|
||||
*/
|
||||
hadc1.Instance = ADC1;
|
||||
hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
|
||||
hadc1.Init.ContinuousConvMode = ENABLE;
|
||||
hadc1.Init.DiscontinuousConvMode = DISABLE;
|
||||
hadc1.Init.ContinuousConvMode = DISABLE;
|
||||
hadc1.Init.DiscontinuousConvMode = ENABLE;
|
||||
hadc1.Init.NbrOfDiscConversion = 1;
|
||||
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
|
||||
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
|
||||
hadc1.Init.NbrOfConversion = 2;
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
/* USER CODE BEGIN Includes */
|
||||
#include "stdio.h"
|
||||
#include "AbsDrive_OLED.h"
|
||||
#include "RockingBar.h"
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
@@ -68,7 +69,7 @@ void SystemClock_Config(void);
|
||||
int main(void)
|
||||
{
|
||||
/* USER CODE BEGIN 1 */
|
||||
u16 adcv[]={};
|
||||
uint32_t adcv[2]={};
|
||||
/* USER CODE END 1 */
|
||||
|
||||
/* MCU Configuration--------------------------------------------------------*/
|
||||
@@ -94,25 +95,20 @@ int main(void)
|
||||
MX_SPI2_Init();
|
||||
/* USER CODE BEGIN 2 */
|
||||
ABS_OLED_Drive OLED=Create_OLED();
|
||||
HAL_ADC_Start(&hadc1);
|
||||
HAL_ADC_PollForConversion(&hadc1,10);
|
||||
RockingBarInit();
|
||||
/* USER CODE END 2 */
|
||||
|
||||
/* Infinite loop */
|
||||
/* USER CODE BEGIN WHILE */
|
||||
while (1)
|
||||
{
|
||||
|
||||
HAL_Delay(500);
|
||||
for(int i=0;i<2;i++){
|
||||
|
||||
adcv[i] = HAL_ADC_GetValue(&hadc1);
|
||||
OLED.ShowNum(0,0,adcv[0],4,8,1);
|
||||
OLED.ShowNum(0,9,adcv[1],4,8,1);
|
||||
OLED.Refresh();
|
||||
}
|
||||
|
||||
// HAL_ADC_Stop(&hadc1);
|
||||
|
||||
RockingBar_GetValue();
|
||||
OLED.ShowNum(0,32,RockingBar_Value[0],4,8,1);
|
||||
OLED.ShowNum(0,40,RockingBar_Value[1],4,8,1);
|
||||
OLED.Showdecimal(0,0,-12.5,3,1,16,1);
|
||||
OLED.Showdecimal(0,16,RockingBar_Value[1],3,1,16,1);
|
||||
OLED.Refresh();
|
||||
|
||||
/* USER CODE END WHILE */
|
||||
|
||||
|
||||
85
yaokon/Core/Src/queue.c
Normal file
85
yaokon/Core/Src/queue.c
Normal file
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
*@文件:queue.c
|
||||
*@作者:‘你遇了我’
|
||||
*@time:2022/11/13
|
||||
*@联系:QQ:321640253
|
||||
*@描述:
|
||||
*/
|
||||
//
|
||||
// Created by 86186 on 2022/11/13.
|
||||
//
|
||||
|
||||
#include "queue.h"
|
||||
|
||||
/*
|
||||
* @简介:初始化一个空队列
|
||||
* @参数:void
|
||||
* @返回值:初始化队列的指针
|
||||
* */
|
||||
void InitQuecu(SqQuecu *Q){
|
||||
Q->front=Q->rear=-1;
|
||||
Q->size=0;
|
||||
}
|
||||
|
||||
// /*
|
||||
// * @简介:销毁队列
|
||||
// * @参数:队列指针
|
||||
// * @返回值:void
|
||||
// * */
|
||||
// void DestroyQueue(SqQuecu *Q){
|
||||
// free(Q);
|
||||
// }
|
||||
|
||||
/*
|
||||
* @简介:判断队列为空
|
||||
* @参数:队列指针
|
||||
* @返回值:布尔值
|
||||
* */
|
||||
bool QueueEmpty(SqQuecu *Q){
|
||||
if(Q->size==0)return true;
|
||||
else return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* @简介:判断队列为满
|
||||
* @参数:队列指针
|
||||
* @返回值:布尔值
|
||||
* */
|
||||
bool QueueFull(SqQuecu *Q){
|
||||
if(Q->size==Maxsize)return true;
|
||||
else return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* @简介:进队
|
||||
* @参数:队列指针
|
||||
* 进队元素
|
||||
* @返回值:布尔值
|
||||
* */
|
||||
bool enQueue(SqQuecu *Q,quecuElemtype e){
|
||||
if(QueueFull(Q))return false;
|
||||
if(Q->rear==Maxsize-1)Q->rear=-1;
|
||||
Q->rear++;
|
||||
Q->data[Q->rear]=e;
|
||||
Q->size++;
|
||||
return true;
|
||||
}
|
||||
|
||||
quecuElemtype deQueue(SqQuecu *Q){
|
||||
if(QueueEmpty(Q))return NULL;
|
||||
quecuElemtype e=Q->data[Q->front];
|
||||
if(Q->front==Maxsize)Q->front=0;
|
||||
Q->front++;
|
||||
Q->size--;
|
||||
return e;
|
||||
}
|
||||
|
||||
|
||||
void DispQuecu(SqQuecu *Q){
|
||||
int i;
|
||||
for(i=0;i<Q->rear-Q->front;i++){
|
||||
printf("%d",Q->data[i+Q->front+1]);
|
||||
printf(",");
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
37
yaokon/Core/Src/queue.h
Normal file
37
yaokon/Core/Src/queue.h
Normal file
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
*@文件:queue.h
|
||||
*@作者:‘你遇了我’
|
||||
*@time:2022/11/13
|
||||
*@联系:QQ:321640253
|
||||
*@描述:
|
||||
*/
|
||||
//
|
||||
// Created by 86186 on 2022/11/13.
|
||||
//
|
||||
|
||||
#ifndef LIST_QUEUE_H
|
||||
#define LIST_QUEUE_H
|
||||
|
||||
#include "stdint.h"
|
||||
#include "stdbool.h"
|
||||
#include "stdlib.h"
|
||||
#include "stdio.h"
|
||||
|
||||
#define Maxsize 20
|
||||
|
||||
typedef uint32_t quecuElemtype;
|
||||
|
||||
typedef struct{
|
||||
quecuElemtype data[Maxsize];
|
||||
int front,rear;
|
||||
uint16_t size;
|
||||
} SqQuecu;
|
||||
|
||||
void InitQuecu(SqQuecu *Q);
|
||||
quecuElemtype deQueue(SqQuecu *Q);
|
||||
bool enQueue(SqQuecu *Q,quecuElemtype e);
|
||||
bool QueueEmpty(SqQuecu *Q);
|
||||
// void DestroyQueue(SqQuecu *Q);
|
||||
void DispQuecu(SqQuecu *Q);
|
||||
|
||||
#endif //LIST_QUEUE_H
|
||||
13
yaokon/Core/User_Drivers/Filtering.c
Normal file
13
yaokon/Core/User_Drivers/Filtering.c
Normal file
@@ -0,0 +1,13 @@
|
||||
#include "Filtering.h"
|
||||
|
||||
|
||||
|
||||
|
||||
Mean_Filtering_DataType Mean_filtering(Mean_Filtering_DataType *dat,uint32_t Dsize){
|
||||
Mean_Filtering_DataType sum=0;
|
||||
for(int i=0;i<Dsize;i++){
|
||||
sum+=*dat;
|
||||
dat++;
|
||||
}
|
||||
return (sum/Dsize);
|
||||
}
|
||||
27
yaokon/Core/User_Drivers/Filtering.h
Normal file
27
yaokon/Core/User_Drivers/Filtering.h
Normal file
@@ -0,0 +1,27 @@
|
||||
#ifndef _FILTERING_H
|
||||
#define _FILTERING_H
|
||||
|
||||
#include "stdint.h"
|
||||
#include "queue.h"
|
||||
|
||||
/*******你需要均值滤波处理的数据类型(BEGIN)*******/
|
||||
/*--按需更改--*/
|
||||
typedef uint32_t Mean_Filtering_DataType;
|
||||
/*******你需要均值滤波处理的数据类型(END)*********/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Mean_Filtering_DataType Mean_filtering(Mean_Filtering_DataType *dat,uint32_t Dsize); //均值滤波函数
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
52
yaokon/Core/User_Drivers/RockingBar.c
Normal file
52
yaokon/Core/User_Drivers/RockingBar.c
Normal file
@@ -0,0 +1,52 @@
|
||||
#include "RockingBar.h"
|
||||
#include "Filtering.h"
|
||||
|
||||
//static uint32_t RockingBar_ADC_Value[ROCKING_BAR_CH][FILLTERING_NUM];
|
||||
float RockingBar_Value[ROCKING_BAR_CH];
|
||||
SqQuecu RockingBar_ADC_Value_0;
|
||||
SqQuecu RockingBar_ADC_Value_1;
|
||||
SqQuecu RockingBar_ADC_Value_2;
|
||||
SqQuecu *P[ROCKING_BAR_CH]={&RockingBar_ADC_Value_0,&RockingBar_ADC_Value_1};
|
||||
/*函数RockingBar_ADC_GetValue
|
||||
* 功能:获取ADC转换的值存在数组中
|
||||
*/
|
||||
void RockingBarInit(void){
|
||||
InitQuecu(&RockingBar_ADC_Value_0);
|
||||
InitQuecu(&RockingBar_ADC_Value_1);
|
||||
}
|
||||
|
||||
|
||||
void RockingBar_ADC_GetValue(void){
|
||||
uint32_t sum=0;
|
||||
uint8_t num=0;
|
||||
uint32_t adcv=0;
|
||||
|
||||
for(int i=0;i<ROCKING_BAR_CH;i++){
|
||||
HAL_ADC_Start(&hadc1); //启动ADC转换
|
||||
HAL_ADC_PollForConversion(&hadc1,10); //等待ADC转换完成
|
||||
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC))
|
||||
{
|
||||
adcv = HAL_ADC_GetValue(&hadc1);
|
||||
if(enQueue(P[i],adcv)==false)deQueue(P[i]);
|
||||
enQueue(P[i],adcv);
|
||||
}
|
||||
|
||||
}
|
||||
HAL_ADC_Stop(&hadc1);
|
||||
|
||||
for(int i=0;i<ROCKING_BAR_CH;i++){
|
||||
sum=0;
|
||||
num=0;
|
||||
for(int n=0;n<P[i]->size;n++){
|
||||
num+=1;
|
||||
sum += P[i]->data[n];
|
||||
}
|
||||
RockingBar_Value[i]=sum/num;
|
||||
}
|
||||
}
|
||||
|
||||
void RockingBar_GetValue(void){
|
||||
RockingBar_ADC_GetValue();
|
||||
RockingBar_Value[0] = THRUST_MIN + ((THRUST_MAX-THRUST_MIN)/(4096))*(RockingBar_Value[0]-0);
|
||||
RockingBar_Value[1] = YAW_MIN + ((YAW_MAX-YAW_MIN)/(4096))*(RockingBar_Value[1]-0);
|
||||
}
|
||||
32
yaokon/Core/User_Drivers/RockingBar.h
Normal file
32
yaokon/Core/User_Drivers/RockingBar.h
Normal file
@@ -0,0 +1,32 @@
|
||||
#ifndef _ROCKING_BAR_H
|
||||
#define _ROCKING_BAR_H
|
||||
|
||||
/*----stm32相关头文件(BEGIN)-------*/
|
||||
#include "main.h"
|
||||
#include "adc.h"
|
||||
/*----stm32相关头文件(END)---------*/
|
||||
#include "stdint.h"
|
||||
#include "queue.h"
|
||||
|
||||
|
||||
|
||||
#define ROCKING_BAR_CH 2 //采集的通道数
|
||||
#define FILLTERING_NUM 100 //均值滤波
|
||||
|
||||
#define THRUST_MAX (float)100
|
||||
#define THRUST_MIN (float)-100
|
||||
#define YAW_MAX (float)200
|
||||
#define YAW_MIN (float)-200
|
||||
|
||||
|
||||
extern float RockingBar_Value[ROCKING_BAR_CH];
|
||||
|
||||
void RockingBarInit(void);
|
||||
void RockingBar_ADC_GetValue(void);
|
||||
void RockingBar_GetValue(void);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user