#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采集控制标志位 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(); } 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] = 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; }