This repository has been archived on 2025-04-28. You can view files and clone it, but cannot push or open issues or pull requests.
CMS3in1/1.Cabin/4.MISC/CMS_BMS/VM_App/VM_AD7606.c

327 lines
8.1 KiB
C
Raw Normal View History

#include "VM_AD7606.h"
#include "delay.h"
#include "usart.h"
#include "VM_Sampling_Control.h"
uint8_t AD_Data_Arr[16448];
uint8_t AD7606_Sampling_Flag = 0; //AD<41>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>Ʊ<EFBFBD>־λ 0: ֹͣ<CDA3>ɼ<EFBFBD>; 1: <20><>ʼ<EFBFBD>ɼ<EFBFBD>
uint16_t AD_Arr_Num = 4; //<2F><><EFBFBD><EFBFBD>λ<EFBFBD>ñ<EFBFBD>־
uint16_t AD_Tim_Num = 0; //AD<41>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t AD7606_SFC = 4; //AD<41><44><EFBFBD><EFBFBD>Ƶ<EFBFBD>ʿ<EFBFBD><CABF><EFBFBD>
uint16_t AD7606_SONC = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int16_t AD7606_DATA_Arr = 0; //<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ݴ<EFBFBD>ȡ<EFBFBD><C8A1>
//AD7606<30><36><EFBFBD>ų<EFBFBD>ʼ<EFBFBD><CABC>
void AD7606_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOG_CLK_ENABLE();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPIO_InitStructure.Mode = GPIO_MODE_INPUT;//<2F><><EFBFBD><EFBFBD>ģʽ
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; //<2F>ٶ<EFBFBD>50MHz
GPIO_InitStructure.Pull = GPIO_NOPULL; //<2F><><EFBFBD><EFBFBD>
//PD DB0 DB1 DB2
GPIO_InitStructure.Pin = AD7606_DB0| AD7606_DB1| AD7606_DB2;
HAL_GPIO_Init(GPIOD,&GPIO_InitStructure);
//PA DB3 DB4 DB5 DB6
GPIO_InitStructure.Pin = AD7606_DB3| AD7606_DB4| AD7606_DB5| AD7606_DB6;
HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);
//PC DB7 DB8 DB9 DB10
GPIO_InitStructure.Pin = AD7606_DB7| AD7606_DB8| AD7606_DB9| AD7606_DB10;
HAL_GPIO_Init(GPIOC,&GPIO_InitStructure);
//PG DB11 DB12 DB13 BUSY FRSTDATA
GPIO_InitStructure.Pin = AD7606_DB11| AD7606_DB12| AD7606_DB13| AD7606_BUSY| AD7606_FRSTDATA;
HAL_GPIO_Init(GPIOG,&GPIO_InitStructure);
//PB DB14 DB15
GPIO_InitStructure.Pin = AD7606_DB14| AD7606_DB15;
HAL_GPIO_Init(GPIOB,&GPIO_InitStructure);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;//<2F><><EFBFBD><EFBFBD>ģʽ
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; //<2F>ٶ<EFBFBD>50MHz
GPIO_InitStructure.Pull = GPIO_NOPULL; //<2F><><EFBFBD><EFBFBD>
//PB CONVST RANGE
GPIO_InitStructure.Pin = AD7606_CONVST| AD7606_RANGE;
HAL_GPIO_Init(GPIOB,&GPIO_InitStructure);
//PE OS0 OS1 OS2 BYTE_SEL STBY
GPIO_InitStructure.Pin = AD7606_OS0| AD7606_OS1| AD7606_OS2| AD7606_STBY| AD7606_BYTE_SEL;
HAL_GPIO_Init(GPIOE,&GPIO_InitStructure);
//PG RESET RD CS
GPIO_InitStructure.Pin = AD7606_RESET| AD7606_RD| AD7606_CS;
HAL_GPIO_Init(GPIOG,&GPIO_InitStructure);
AD7606_Config();
}
//AD7606<30><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void AD7606_Config(void){
delay_us(1); //<2F><>ʱ<EFBFBD>ȴ<EFBFBD>AD7606<30>ϵ<EFBFBD>
AD7606_Reset(); //<2F>ϵ縴λ
AD7606_STBY_NORMAL(); //<2F><><EFBFBD><EFBFBD>ģʽ
AD7606_RANGE_5V(); //ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD>Χ <20><><EFBFBD><EFBFBD>5V
AD7606_PRL(); //<2F><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>
AD7606_Semples(AD7606_SEMPLE_200K); //0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AD7606_Reset(); //<2F>ϵ縴λ
}
//<2F><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OS[2:0]
void AD7606_Semples(u8 AD7606_Semp_Select){
switch(AD7606_Semp_Select){
case AD7606_SEMPLE_200K: //000
AD7606_OS2_LOW();
AD7606_OS1_LOW();
AD7606_OS0_LOW();
break;
case AD7606_SEMPLE_100K: //001
AD7606_OS2_LOW();
AD7606_OS1_LOW();
AD7606_OS0_HIGH();
break;
case AD7606_SEMPLE_50K: //010
AD7606_OS2_LOW();
AD7606_OS1_HIGH();
AD7606_OS0_LOW();
break;
case AD7606_SEMPLE_25K: //011
AD7606_OS2_LOW();
AD7606_OS1_HIGH();
AD7606_OS0_HIGH();
break;
case AD7606_SEMPLE_12K5: //100
AD7606_OS2_HIGH();
AD7606_OS1_LOW();
AD7606_OS0_LOW();
break;
case AD7606_SEMPLE_6K25: //101
AD7606_OS2_HIGH();
AD7606_OS1_LOW();
AD7606_OS0_HIGH();
break;
case AD7606_SEMPLE_3K125: //110
AD7606_OS2_HIGH();
AD7606_OS1_HIGH();
AD7606_OS0_LOW();
break;
default:
break;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void AD7606_Data_Pro(uint8_t *Data){
AD7606_DATA_Arr = HAL_GPIO_ReadPin(GPIOD, AD7606_DB0)|
HAL_GPIO_ReadPin(GPIOD, AD7606_DB1) << 1|
HAL_GPIO_ReadPin(GPIOD, AD7606_DB2) << 2|
HAL_GPIO_ReadPin(GPIOA, AD7606_DB3) << 3|
HAL_GPIO_ReadPin(GPIOA, AD7606_DB4) << 4|
HAL_GPIO_ReadPin(GPIOA, AD7606_DB5) << 5|
HAL_GPIO_ReadPin(GPIOA, AD7606_DB6) << 6|
HAL_GPIO_ReadPin(GPIOC, AD7606_DB7) << 7|
HAL_GPIO_ReadPin(GPIOC, AD7606_DB8) << 8|
HAL_GPIO_ReadPin(GPIOC, AD7606_DB9) << 9|
HAL_GPIO_ReadPin(GPIOC, AD7606_DB10) << 10|
HAL_GPIO_ReadPin(GPIOG, AD7606_DB11) << 11|
HAL_GPIO_ReadPin(GPIOG, AD7606_DB12) << 12|
HAL_GPIO_ReadPin(GPIOG, AD7606_DB13) << 13|
HAL_GPIO_ReadPin(GPIOB, AD7606_DB14) << 14|
HAL_GPIO_ReadPin(GPIOB, AD7606_DB15) << 15;
Data[0] = AD7606_DATA_Arr >> 8;
Data[1] = AD7606_DATA_Arr;
}
//AD7606<30><36>λ<EFBFBD>ź<EFBFBD>
void AD7606_Reset(void){
/* AD7606<30>Ǹߵ<C7B8>ƽ<EFBFBD><C6BD>λ<EFBFBD><CEBB>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>50ns ָ<><D6B8>ִ<EFBFBD><D6B4>ʱ<EFBFBD><CAB1>Ϊ60ns*/
AD7606_RST_LOW();
AD7606_RST_HIGH();
AD7606_RST_LOW();
}
//AD7606<30><36>ʼת<CABC><D7AA><EFBFBD>ź<EFBFBD>
void AD7606_Start_Convst(void){
/* <20><><EFBFBD><EFBFBD><EFBFBD>ؿ<EFBFBD>ʼת<CABC><D7AA><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>25ns */
AD7606_CONVST_HIGH();
//delay_us(1);
AD7606_CONVST_LOW();
//delay_us(1);
AD7606_CONVST_HIGH();
}
//AD7606<30><36><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>ź<EFBFBD>
void AD7606_End_Convst(void){
AD7606_CONVST_HIGH();
//delay_us(1);
AD7606_CONVST_LOW();
//delay_us(1);
AD7606_CONVST_HIGH();
}
//AD7606<30><36>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
void AD7606_Read(uint8_t *Data){
int j = 0;
AD7606_CS_HIGH();
AD7606_RD_HIGH();
AD7606_Start_Convst(); //<2F><>ʼת<CABC><D7AA>
//delay_us(1);
while(AD7606_BUSY_STATE){}//<2F>ȴ<EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//delay_us(1);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
AD7606_CS_LOW(); //<2F><><EFBFBD><EFBFBD>CS<43><53> ׼<><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD>ȡ
AD7606_RD_LOW(); //<2F><><EFBFBD><EFBFBD>RD<52><44> <20>ȴ<EFBFBD>FRSTDATA<54><41>1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>ȡ
// while(!AD7606_FRST_STATE){}
//delay_us(1);
for(j=0; j<8; j++){
AD7606_Data_Pro( &Data[AD_Arr_Num + (j*1028)] );
AD7606_RD_HIGH(); //<2F>л<EFBFBD>RD<52><44>״̬ ׼<><D7BC><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>һͨ<D2BB><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AD7606_RD_LOW();
}
AD_Arr_Num += 2;
//<2F><><EFBFBD>ݻ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
AD7606_CS_HIGH();
AD7606_RD_HIGH();
CDC_Data_Send();
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD>ֽ<EFBFBD>
void Float_to_Byte(float data, uint8_t *arr){
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
union{
float float_val;
struct{
uint8_t low_byte;
uint8_t mlow_byte;
uint8_t mhigh_byte;
uint8_t high_byte;
}byte_arr;
}Float_Byte;
//<2F><>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Float_Byte.float_val = data;
//<2F><>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
arr[0] = Float_Byte.byte_arr.high_byte;
arr[1] = Float_Byte.byte_arr.mhigh_byte;
arr[2] = Float_Byte.byte_arr.mlow_byte;
arr[3] = Float_Byte.byte_arr.low_byte;
}
void Data_to_ADbuf(void){
AD_Data_Arr[1028*0 + 0] = 0x00;
AD_Data_Arr[1028*0 + 1] = 0x00;
AD_Data_Arr[1028*0 + 2] = 0x00;
AD_Data_Arr[1028*0 + 3] = 0x00;
AD_Data_Arr[1028*1 + 0] = 0x01;
AD_Data_Arr[1028*1 + 1] = 0x01;
AD_Data_Arr[1028*1 + 2] = 0x01;
AD_Data_Arr[1028*1 + 3] = 0x01;
AD_Data_Arr[1028*2 + 0] = 0x02;
AD_Data_Arr[1028*2 + 1] = 0x02;
AD_Data_Arr[1028*2 + 2] = 0x02;
AD_Data_Arr[1028*2 + 3] = 0x02;
AD_Data_Arr[1028*3 + 0] = 0x03;
AD_Data_Arr[1028*3 + 1] = 0x03;
AD_Data_Arr[1028*3 + 2] = 0x03;
AD_Data_Arr[1028*3 + 3] = 0x03;
AD_Data_Arr[1028*4 + 0] = 0x04;
AD_Data_Arr[1028*4 + 1] = 0x04;
AD_Data_Arr[1028*4 + 2] = 0x04;
AD_Data_Arr[1028*4 + 3] = 0x04;
AD_Data_Arr[1028*5 + 0] = 0x05;
AD_Data_Arr[1028*5 + 1] = 0x05;
AD_Data_Arr[1028*5 + 2] = 0x05;
AD_Data_Arr[1028*5 + 3] = 0x05;
AD_Data_Arr[1028*6 + 0] = 0x06;
AD_Data_Arr[1028*6 + 1] = 0x06;
AD_Data_Arr[1028*6 + 2] = 0x06;
AD_Data_Arr[1028*6 + 3] = 0x06;
AD_Data_Arr[1028*7 + 0] = 0x07;
AD_Data_Arr[1028*7 + 1] = 0x07;
AD_Data_Arr[1028*7 + 2] = 0x07;
AD_Data_Arr[1028*7 + 3] = 0x07;
AD_Data_Arr[1028*8 + 0] = 0x00;
AD_Data_Arr[1028*8 + 1] = 0x00;
AD_Data_Arr[1028*8 + 2] = 0x00;
AD_Data_Arr[1028*8 + 3] = 0x00;
AD_Data_Arr[1028*9 + 0] = 0x01;
AD_Data_Arr[1028*9 + 1] = 0x01;
AD_Data_Arr[1028*9 + 2] = 0x01;
AD_Data_Arr[1028*9 + 3] = 0x01;
AD_Data_Arr[1028*10 + 0] = 0x02;
AD_Data_Arr[1028*10 + 1] = 0x02;
AD_Data_Arr[1028*10 + 2] = 0x02;
AD_Data_Arr[1028*10 + 3] = 0x02;
AD_Data_Arr[1028*11 + 0] = 0x03;
AD_Data_Arr[1028*11 + 1] = 0x03;
AD_Data_Arr[1028*11 + 2] = 0x03;
AD_Data_Arr[1028*11 + 3] = 0x03;
AD_Data_Arr[1028*12 + 0] = 0x04;
AD_Data_Arr[1028*12 + 1] = 0x04;
AD_Data_Arr[1028*12 + 2] = 0x04;
AD_Data_Arr[1028*12 + 3] = 0x04;
AD_Data_Arr[1028*13 + 0] = 0x05;
AD_Data_Arr[1028*13 + 1] = 0x05;
AD_Data_Arr[1028*13 + 2] = 0x05;
AD_Data_Arr[1028*13 + 3] = 0x05;
AD_Data_Arr[1028*14 + 0] = 0x06;
AD_Data_Arr[1028*14 + 1] = 0x06;
AD_Data_Arr[1028*14 + 2] = 0x06;
AD_Data_Arr[1028*14 + 3] = 0x06;
AD_Data_Arr[1028*15 + 0] = 0x07;
AD_Data_Arr[1028*15 + 1] = 0x07;
AD_Data_Arr[1028*15 + 2] = 0x07;
AD_Data_Arr[1028*15 + 3] = 0x07;
}