新手入门
- 积分
- 10
- 金钱
- 10
- 注册时间
- 2019-7-24
- 在线时间
- 2 小时
|
1金钱
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "bmp.h"
#include "usart.h"
//#include "i2c_ee.h"
#include "adc.h"
#include "rtc.h"
#include "stmflash.h"
#include "24cxx.h"
#include "mpu6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"
#include "math.h"
#define pai 3.1415926
#define N 5
#define CS_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_9)
#define CS_ON GPIO_SetBits(GPIOB, GPIO_Pin_9)
//#define LED_NEGATION GPIO_WriteBit(GPIOB, GPIO_Pin_6, (BitAction)!GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_6))
#define SLK_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_8)
#define SLK_ON GPIO_SetBits(GPIOB, GPIO_Pin_8)
#define POWER_OFF GPIO_ResetBits(GPIOA, GPIO_Pin_1)
#define POWER_ON GPIO_SetBits(GPIOA, GPIO_Pin_1)
#define LED_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_1)
#define LED_ON GPIO_SetBits(GPIOB, GPIO_Pin_1)
#define KEY GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)
#define DI1 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5)
#define DI2 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6)
#define DI3 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7)
#define EEP_Firstpage 0x0000
u8 I2c_Buf_Write[256]={0};
u8 I2c_Buf_Read[256]={0};
u8 const flash_Buf_Write[256]={0};
u8 const flash_Buf_Read[256]={0};
//STMFLASH_Write(flash_Buf_Write,(u16*)I2c_Buf_Write,256);
//STMFLASH_Read((u32)flash_Buf_Write,(u16*)I2c_Buf_Read,256);
void GPIOB_Init(void);
void AS5045(void);
void WDD35D4(void);
void ZiJian(void);
void I2C_XieRu(void);
void I2C_DuChu(void);
void I2C_ShuChu(void);
void DianLiang_JianCe(void);
void AnJian_ChuLi(void);
float MiddlevalueFilter(void);
u8 y,num_KEY,num_I2C,num_DiYa,num_QianYa,BZ_power,BZ_BaoCun;
s16 DataX,DataY,DataZ,printf_Data;
// DataX,DataY,DataZ,printf_Data;
u8 ii;//用于for循环
float pitch,roll,yaw; //???
short aacx,aacy,aacz; //??????????
short temp; //??
float accccy;//mpu6050角度
float accccy_buf[N];//连续读mpu6050数据缓存
float accccy_eve;//mpu6050取中值
u16 acccy;//换算用于显示
int main(void)
{
float zzz;
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
OLED_Init(); //初始化OLED
GPIOB_Init();
uart_init(38400);
AT24CXX_Init();
MPU_Init(); //初始化MPU6050
Adc_Init(); //ADC初始化
RTC_Init(); //RTC初始化
POWER_OFF;
LED_OFF;
delay_ms(1000);
POWER_ON;
LED_ON;
BZ_power=1;
num_KEY=0;
ZiJian();
DataX=0;
DataY=0;
DataZ=0;
OLED_Clear();//清屏
OLED_DrawBMP(0,0,128,8,BMP3); //欢迎界面
delay_ms(1500);
OLED_Clear();//清屏
delay_ms(200);
OLED_DianLiang(Get_Adc_Average(ADC_Channel_4,32));//显示电量
delay_ms(1000);
delay_ms(1000);
OLED_Clear();//清屏
I2C_DuChu();
OLED_Clear();//清屏
OLED_DrawBMP(0,0,128,8,BMP2); //界面
while(1)
{
if(BZ_power==1)//电源标志
{
AS5045();//选用AS5045传感器
shuiping(DataX*0.87891+53);//写入水平值
if(DataY>=20)//偏移值
{
chuizhi(DataY*0.8789-20);//写入垂直值 偏移值524对应的度数
}
else
{
chuizhi(DataY*0.8789+3580);//写入垂直值
}
DianLiang_JianCe();//电量检测
AnJian_ChuLi();//按键处理程序
if(GetAngleFromACC(0)<0)
{
zzz = 90.0;
}
else {
zzz=fabs(GetAngleFromACC(0));
if(zzz<4.1)
zzz=4.1-zzz;
else
zzz=zzz-4.1;
}
acccy=(int)(zzz*100);
pianjiao(acccy);//写入偏角值 显示度数
//////////////////////////////////////////////////////////////////////
}
}
}
float MiddlevalueFilter()
{
unsigned char jjj,kkk;
float temp;
for (jjj=0;jjj<N-1;jjj++)
{
for (kkk=0;kkk<N-jjj;kkk++)
{
if(accccy_buf[kkk]>accccy_buf[kkk+1])
{
temp = accccy_buf[kkk];
accccy_buf[kkk] = accccy_buf[kkk+1];
accccy_buf[kkk+1] = temp;
}
}
}
return accccy_buf[(N-1)/2];
}
void AS5045(void)//AS5045传感器
{
u32 AS5045D1,AS5045D2,AS5045D3;
u8 i;
CS_OFF;
AS5045D1=0;
AS5045D2=0;
AS5045D3=0;
delay_us(10);
SLK_OFF;
delay_us(1);
for(i=0;i<18;i++)
{
delay_us(1);
SLK_ON;
delay_us(1);
AS5045D1=(AS5045D1<<1)|DI1;
AS5045D2=(AS5045D2<<1)|DI2;
AS5045D3=(AS5045D3<<1)|DI3;
SLK_OFF;
}
delay_us(2);
CS_ON;
DataX=(DataX+(AS5045D1>>6))/2;
DataY=(DataY+(AS5045D2>>6))/2;
DataZ=(DataZ+(AS5045D3>>6))/2;
// printf("---------------------------DataY----------------------------%d\r\n", DataY);
}
void WDD35D4(void)//WDD35D4传感器
{
DataX=(DataX+Get_Adc_Average(ADC_Channel_5,32))/2;
DataY=(DataY+Get_Adc_Average(ADC_Channel_6,32))/2;
DataZ=(DataZ+Get_Adc_Average(ADC_Channel_7,32))/2;
}
void I2C_XieRu(void)//保存数据到EEPROM
{
num_I2C++;
if(num_I2C>=20)//最多保存20组数据
num_I2C=0;
I2c_Buf_Write[240]=num_I2C;//写入起始标志
I2c_Buf_Write[num_I2C*12+0]=DataX%256;
I2c_Buf_Write[num_I2C*12+1]=DataX/256;
I2c_Buf_Write[num_I2C*12+2]=DataY%256;
I2c_Buf_Write[num_I2C*12+3]=DataY/256;
I2c_Buf_Write[num_I2C*12+4]=acccy%256;
I2c_Buf_Write[num_I2C*12+5]=acccy/256;
I2c_Buf_Write[num_I2C*12+6]=calendar.min;//分
I2c_Buf_Write[num_I2C*12+7]=calendar.hour;//时
I2c_Buf_Write[num_I2C*12+8]=calendar.w_date;//日
I2c_Buf_Write[num_I2C*12+9]=calendar.w_month;//月
I2c_Buf_Write[num_I2C*12+10]=calendar.w_year%256;//年L
I2c_Buf_Write[num_I2C*12+11]=calendar.w_year/256;//年H
AT24CXX_Write( EEP_Firstpage, I2c_Buf_Write, 256); //写入
// STMFLASH_Write((u32)flash_Buf_Write,(u16*)I2c_Buf_Write,256);
}
void I2C_DuChu(void)//读出EEPROM数据
{
u8 i;
AT24CXX_Read( EEP_Firstpage, I2c_Buf_Write, 256); //读出
// STMFLASH_Read((u32)flash_Buf_Write,(u16*)I2c_Buf_Read,256);
for(i=0;i<240;i++)
{
I2c_Buf_Write[i]=I2c_Buf_Read[i];
}
num_I2C=I2c_Buf_Read[240];
}
void I2C_ShuChu(void)//printf输出EEPROM数据
{
u8 i,num;
double Data;
AT24CXX_Read( EEP_Firstpage, I2c_Buf_Read, 256); //读出
// STMFLASH_Read((u32)flash_Buf_Write,(u16*)I2c_Buf_Read,256);
num_I2C=I2c_Buf_Read[240];
for(i=0;i<20;i++)
{
num=((num_I2C+i+1)%20)*12;
if((20-i)<10)
printf("%d",0);
printf("%d.",20-i);//序号
printf("%d-",(I2c_Buf_Read[num+11]<<8)+I2c_Buf_Read[num+10]);//年
if(I2c_Buf_Read[num+9]<10)
printf("%d",0);
printf("%d-",I2c_Buf_Read[num+9]);//月
if(I2c_Buf_Read[num+8]<10)
printf("%d",0);
printf("%d ",I2c_Buf_Read[num+8]);//日
if(I2c_Buf_Read[num+7]<10)//时
printf("%d",0);
printf("%d:",I2c_Buf_Read[num+7]);
if(I2c_Buf_Read[num+6]<10)
printf("%d",0);
printf("%d ",I2c_Buf_Read[num+6]);//分
printf("X=");
printf_Data=((I2c_Buf_Read[num+1]<<8)+I2c_Buf_Read[num+0])*0.87891+53;
Data=printf_Data;
printf("%.1f ",Data/10);
if(printf_Data<1000)
printf(" ");
if(printf_Data<100)
printf(" ");
printf("Y=");
// //缪修改
if(((I2c_Buf_Read[num+3]<<8)+I2c_Buf_Read[num+2])>=20) //偏移值
{
printf_Data=((I2c_Buf_Read[num+3]<<8)+I2c_Buf_Read[num+2])*0.87891-20; //偏移值524对应的度数
}
else
{
printf_Data=((I2c_Buf_Read[num+3]<<8)+I2c_Buf_Read[num+2])*0.87891+3580;
}
// printf_Data=((I2c_Buf_Read[num+3]<<8)+I2c_Buf_Read[num+2])*0.87891;
Data=printf_Data;
printf("%.1f ",Data/10);
if(printf_Data<1000)
printf(" ");
if(printf_Data<100)
printf(" ");
printf("Z=");
printf_Data=((I2c_Buf_Read[num+5]<<8)+I2c_Buf_Read[num+4]);
Data=printf_Data+1.7;
printf("%.1f",Data/100);
printf("\r\n");
}
}
void DianLiang_JianCe(void)//电量检测
{
if(Get_Adc_Average(ADC_Channel_7,10)<=2110)//电量低监测 低于1.7V 1.7/3.3*4096=2110
{
num_DiYa++;
if(num_DiYa>=13)//电量指示闪烁
{
num_DiYa=0;
OLED_Clear();//清屏
delay_ms(20);
OLED_DianLiang(Get_Adc_Average(ADC_Channel_7,32));//显示电量
delay_ms(600);
OLED_Clear();//清屏
delay_ms(20);
OLED_DrawBMP(0,0,128,8,BMP2); //界面
}
if(Get_Adc_Average(ADC_Channel_7,10)<=1986)//欠压监测 1.6v 1986
{
num_QianYa++;
if(num_QianYa>=10)//欠压1秒关机
{
OLED_Clear();//清屏
delay_ms(20);
OLED_DianLiang(2967);//显示电量
delay_ms(600);
OLED_DianLiang(2890);//显示电量
delay_ms(600);
OLED_DianLiang(2813);//显示电量
delay_ms(600);
OLED_DianLiang(2698);//显示电量
delay_ms(600);
OLED_DianLiang(2621);//显示电量
delay_ms(600);
OLED_Clear();//清屏
BZ_power=0;//清电源标志位
POWER_OFF;//关闭电源
LED_OFF;
}
}
else
{
if(num_QianYa!=0)
num_QianYa--;
}
}
else
{
if(num_DiYa!=0)
num_DiYa--;
}
}
void AnJian_ChuLi(void)//按键处理程序
{
if(KEY==0)//若按键按下
{
num_KEY++;//计数增加 PS:不用消抖可忽略按键毛刺
if(num_KEY>=100)//连续按下超过2秒//(num_KEY>=20
{
OLED_Clear();//清屏
BZ_power=0;//清电源标志位
POWER_OFF;//关闭电源
LED_OFF;
}
delay_ms(10);
if((KEY==0)&&(num_KEY<=14)&&(BZ_power==1))//延时10mS若按键还是按下 //num_KEY<=2
{
BZ_BaoCun=1;//保存标志位
LED_OFF;
}
if((num_KEY>=15)&&(BZ_power==1))//若按键连续按下超过1秒//num_KEY>=10
{
BZ_BaoCun=0;//清空保存标志位
LED_ON;
}
}
else//若按键松手
{
delay_ms(10);
if(num_KEY!=0)//若按下计时不等于0
num_KEY--;//减小按键计时 PS:不用消抖可忽略按键毛刺
if((KEY==1)&&(BZ_BaoCun==1)&&(BZ_power==1))//消抖后
{
BZ_BaoCun=0;//清空保存标志位
OLED_Clear();//清屏
delay_ms(200);
I2C_XieRu();
OLED_DrawBMP(0,2,128,6,BMP4); //显示保存成功
I2C_ShuChu();
LED_ON;
delay_ms(1000);
OLED_Clear();//清屏
delay_ms(200);
OLED_DrawBMP(0,0,128,8,BMP2); //显示界面
}
}
}
void ZiJian(void)//自检
{
// AS5045();
if(Get_Adc_Average(ADC_Channel_7,10)<=1986)//欠压监测 1.6V
{
delay_ms(20);
if(Get_Adc_Average(ADC_Channel_7,10)<=1986) //1986
{
OLED_Clear();//清屏
delay_ms(20);
OLED_DianLiang(2957);//显示电量2957
delay_ms(600);
OLED_DianLiang(2890);//显示电量2890
delay_ms(600);
OLED_DianLiang(2813);//显示电量2813
delay_ms(600);
OLED_DianLiang(2698);//显示电量2698
delay_ms(600);
OLED_DianLiang(2621);//显示电量2621
delay_ms(600);
OLED_Clear();//清屏
BZ_power=0;//清电源标志位
POWER_OFF;//关闭电源
LED_OFF;
while(1);
}
}
// else if(Get_Adc_Average(ADC_Channel_7,20)>=2575)//充电监测 4.15V 4.15/2/3.3*4096=2575
// {
// num_QianYa++;
// if(num_QianYa>=13)//欠压1秒关机
// {
// OLED_Clear();//清屏
// delay_ms(20);
// OLED_DianLiang(2967);//显示电量
// delay_ms(400);
// OLED_Clear();//清屏
// delay_ms(400);
// OLED_DianLiang(2967);//显示电量
// delay_ms(600);
// OLED_Clear();//清屏
// delay_ms(600);
// OLED_DianLiang(2967);//显示电量
// delay_ms(600);
// OLED_Clear();//清屏
// delay_ms(600);
// OLED_DianLiang(2967);//显示电量
// delay_ms(600);
// OLED_Clear();//清屏
// delay_ms(600);
// OLED_DianLiang(2967);//显示电量
//
//
// }
// }
//
}
void GPIOB_Init(void) //IO配置
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
|
|