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.
CMS/1.Software/STM32/USB_HS _ TEST/VM_App/VM_AD7606.c
2024-11-19 17:19:21 +08:00

340 lines
8.4 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "VM_AD7606.h"
#include "delay.h"
#include "usart.h"
#include "VM_Sampling_Control.h"
uint8_t AD_Data_Arr[18504];
uint8_t AD7606_Sampling_Flag = 0; //AD采集控制标志位 0: 停止采集; 1: 开始采集
uint16_t AD_Arr_Num = 4; //数组位置标志
uint16_t AD_Tim_Num = 0; //AD采集计数器
uint16_t AD7606_SFC = 4; //AD采样频率控制
uint16_t AD7606_SONC = 0; //采样次数控制
int16_t AD7606_DATA_Arr = 0; //采集数据存取器
//AD7606引脚初始化
void AD7606_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
//开启对应引脚时钟
__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();
//浮空输入配置
GPIO_InitStructure.Mode = GPIO_MODE_INPUT;//输入模式
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; //速度50MHz
GPIO_InitStructure.Pull = GPIO_NOPULL; //浮空
//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);
//推挽输出配置
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;//输出模式
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; //速度50MHz
GPIO_InitStructure.Pull = GPIO_NOPULL; //浮空
//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工作配置
void AD7606_Config(void){
delay_us(1); //延时等待AD7606上电
AD7606_Reset(); //上电复位
AD7606_STBY_NORMAL(); //正常模式
AD7606_RANGE_5V(); //模拟输入范围 正负5V
AD7606_PRL(); //并口通信
AD7606_Semples(AD7606_SEMPLE_200K); //0倍过采样
AD7606_Reset(); //上电复位
}
//采样频率设置 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;
}
}
//读出结果
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复位信号
void AD7606_Reset(void){
/* AD7606是高电平复位要求最小脉宽50ns 指令执行时间为60ns*/
AD7606_RST_LOW();
AD7606_RST_HIGH();
AD7606_RST_LOW();
}
//AD7606开始转换信号
void AD7606_Start_Convst(void){
/* 上升沿开始转换低电平持续时间至少25ns */
AD7606_CONVST_HIGH();
//delay_us(1);
AD7606_CONVST_LOW();
//delay_us(1);
AD7606_CONVST_HIGH();
}
//AD7606结束转换信号
void AD7606_End_Convst(void){
AD7606_CONVST_HIGH();
//delay_us(1);
AD7606_CONVST_LOW();
//delay_us(1);
AD7606_CONVST_HIGH();
}
//AD7606开始测量并获取结果
void AD7606_Read(uint8_t *Data){
int j = 0;
AD7606_CS_HIGH();
AD7606_RD_HIGH();
AD7606_Start_Convst(); //开始转换
//delay_us(1);
while(AD7606_BUSY_STATE){}//等待转换完成
//delay_us(1);
//获取数据
AD7606_CS_LOW(); //拉低CS线 准备进行数据获取
AD7606_RD_LOW(); //拉低RD线 等待FRSTDATA置1 进行数据读取
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(); //切换RD线状态 准备获取下一通道数据
AD7606_RD_LOW();
}
Data[AD_Arr_Num + 8224] = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2); //写入霍尔数据
AD_Arr_Num += 2;
//数据获取及测量 结束
AD7606_CS_HIGH();
AD7606_RD_HIGH();
CDC_Data_Send();
}
//浮点数据转字节
void Float_to_Byte(float data, uint8_t *arr){
//定义联合体
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;
//将转换后的浮点数传入联合体
Float_Byte.float_val = data;
//以小端排序将数据存入数组
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] = 0x08;
AD_Data_Arr[1028*8 + 1] = 0x08;
AD_Data_Arr[1028*8 + 2] = 0x08;
AD_Data_Arr[1028*8 + 3] = 0x08;
AD_Data_Arr[1028*9 + 0] = 0x00;
AD_Data_Arr[1028*9 + 1] = 0x00;
AD_Data_Arr[1028*9 + 2] = 0x00;
AD_Data_Arr[1028*9 + 3] = 0x00;
AD_Data_Arr[1028*10 + 0] = 0x01;
AD_Data_Arr[1028*10 + 1] = 0x01;
AD_Data_Arr[1028*10 + 2] = 0x01;
AD_Data_Arr[1028*10 + 3] = 0x01;
AD_Data_Arr[1028*11 + 0] = 0x02;
AD_Data_Arr[1028*11 + 1] = 0x02;
AD_Data_Arr[1028*11 + 2] = 0x02;
AD_Data_Arr[1028*11 + 3] = 0x02;
AD_Data_Arr[1028*12 + 0] = 0x03;
AD_Data_Arr[1028*12 + 1] = 0x03;
AD_Data_Arr[1028*12 + 2] = 0x03;
AD_Data_Arr[1028*12 + 3] = 0x03;
AD_Data_Arr[1028*13 + 0] = 0x04;
AD_Data_Arr[1028*13 + 1] = 0x04;
AD_Data_Arr[1028*13 + 2] = 0x04;
AD_Data_Arr[1028*13 + 3] = 0x04;
AD_Data_Arr[1028*14 + 0] = 0x05;
AD_Data_Arr[1028*14 + 1] = 0x05;
AD_Data_Arr[1028*14 + 2] = 0x05;
AD_Data_Arr[1028*14 + 3] = 0x05;
AD_Data_Arr[1028*15 + 0] = 0x06;
AD_Data_Arr[1028*15 + 1] = 0x06;
AD_Data_Arr[1028*15 + 2] = 0x06;
AD_Data_Arr[1028*15 + 3] = 0x06;
AD_Data_Arr[1028*16 + 0] = 0x07;
AD_Data_Arr[1028*16 + 1] = 0x07;
AD_Data_Arr[1028*16 + 2] = 0x07;
AD_Data_Arr[1028*16 + 3] = 0x07;
AD_Data_Arr[1028*17 + 0] = 0x08;
AD_Data_Arr[1028*17 + 1] = 0x08;
AD_Data_Arr[1028*17 + 2] = 0x08;
AD_Data_Arr[1028*17 + 3] = 0x08;
}