340 lines
8.4 KiB
C
340 lines
8.4 KiB
C
#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;
|
||
}
|
||
|