277 lines
8.4 KiB
C
277 lines
8.4 KiB
C
#include "./BSP/AD7606/AD7606.h"
|
||
#include "./BSP/TIMER/gtim.h"
|
||
|
||
|
||
/* AD7606 FSMC总线地址,只能读,无需写 */
|
||
#define AD7606_RESULT1() *(__IO uint16_t *)0x60000000
|
||
#define AD7606_RESULT2() *(__IO uint16_t *)0x64000000
|
||
|
||
AD7606_VAR_T g_tAD7606; /* 定义1个全局变量,保存一些参数 */
|
||
AD7606_FIFO_T g_tAdcFifo; /* 定义FIFO结构体变量 */
|
||
|
||
|
||
uint16_t RevNumFlag = 4; /* 转速数据采集计数标志*/
|
||
uint16_t ADNumFlag = 4; /* AD数据采集计数标志*/
|
||
|
||
int flag = 0;
|
||
|
||
void AD7606_Init(void)
|
||
{
|
||
|
||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||
|
||
/* GPIO Ports Clock Enable */
|
||
__HAL_RCC_GPIOC_CLK_ENABLE();
|
||
__HAL_RCC_GPIOF_CLK_ENABLE();
|
||
__HAL_RCC_GPIOH_CLK_ENABLE();
|
||
__HAL_RCC_GPIOE_CLK_ENABLE();
|
||
__HAL_RCC_GPIOD_CLK_ENABLE();
|
||
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||
__HAL_RCC_GPIOG_CLK_ENABLE();
|
||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||
|
||
/*Configure GPIO pin Output Level */
|
||
HAL_GPIO_WritePin(GPIOG, RESET_Pin|RANGE1_Pin|RANGE2_Pin|OS2_Pin|OS1_Pin|OS0_Pin, GPIO_PIN_RESET);
|
||
|
||
/*Configure GPIO pin Output Level */
|
||
HAL_GPIO_WritePin(GPIOB, BYTE_SEL_Pin, GPIO_PIN_RESET);
|
||
HAL_GPIO_WritePin(GPIOB, STBY1_Pin, GPIO_PIN_SET);
|
||
HAL_GPIO_WritePin(GPIOG, STBY2_Pin, GPIO_PIN_SET);
|
||
|
||
|
||
/*Configure GPIO pin Output Level */
|
||
HAL_GPIO_WritePin(CONVEST_GPIO_Port, CONVEST_Pin, GPIO_PIN_SET);
|
||
|
||
/*Configure GPIO pin Output Level */
|
||
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
|
||
|
||
|
||
/*Configure GPIO pin : PtPin */
|
||
GPIO_InitStruct.Pin = GPIO_PIN_2;
|
||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||
|
||
/*Configure GPIO pins : PCPin PCPin */
|
||
GPIO_InitStruct.Pin = FRSTDATA2_Pin;
|
||
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||
HAL_GPIO_Init(FRSTDATA2_GPIO_Port, &GPIO_InitStruct);
|
||
|
||
GPIO_InitStruct.Pin = FRSTDATA1_Pin;
|
||
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||
HAL_GPIO_Init(FRSTDATA1_GPIO_Port, &GPIO_InitStruct);
|
||
|
||
/*Configure GPIO pin : PtPin */
|
||
GPIO_InitStruct.Pin = RESET_Pin;
|
||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||
HAL_GPIO_Init(RESET_GPIO_Port, &GPIO_InitStruct);
|
||
|
||
/*Configure GPIO pin : PtPin */
|
||
GPIO_InitStruct.Pin = RANGE1_Pin;
|
||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||
HAL_GPIO_Init(RANGE1_GPIO_Port, &GPIO_InitStruct);
|
||
|
||
/*Configure GPIO pin : PtPin */
|
||
GPIO_InitStruct.Pin = RANGE2_Pin;
|
||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||
HAL_GPIO_Init(RANGE2_GPIO_Port, &GPIO_InitStruct);
|
||
|
||
/*Configure GPIO pin : PtPin */
|
||
GPIO_InitStruct.Pin = BUSY1_Pin;
|
||
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||
HAL_GPIO_Init(BUSY1_GPIO_Port, &GPIO_InitStruct);
|
||
|
||
/*Configure GPIO pins : PEPin PEPin */
|
||
GPIO_InitStruct.Pin = BUSY2_Pin;
|
||
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||
HAL_GPIO_Init(BUSY2_GPIO_Port, &GPIO_InitStruct);
|
||
|
||
/*Configure GPIO pins : PBPin PBPin */
|
||
GPIO_InitStruct.Pin = BYTE_SEL_Pin;
|
||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||
HAL_GPIO_Init(BYTE_SEL_GPIO_Port, &GPIO_InitStruct);
|
||
|
||
/*Configure GPIO pins : PBPin PBPin */
|
||
GPIO_InitStruct.Pin = STBY2_Pin;
|
||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||
HAL_GPIO_Init(STBY2_GPIO_Port, &GPIO_InitStruct);
|
||
|
||
/*Configure GPIO pins : PBPin PBPin */
|
||
GPIO_InitStruct.Pin = STBY1_Pin;
|
||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||
HAL_GPIO_Init(STBY1_GPIO_Port, &GPIO_InitStruct);
|
||
|
||
/*Configure GPIO pins : PEPin PEPin */
|
||
GPIO_InitStruct.Pin = OS2_Pin|OS1_Pin|OS0_Pin;
|
||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
|
||
|
||
|
||
/*Configure GPIO pins : PEPin PEPin */
|
||
GPIO_InitStruct.Pin = CONVEST_Pin;
|
||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||
HAL_GPIO_Init(CONVEST_GPIO_Port, &GPIO_InitStruct);
|
||
|
||
/*Configure GPIO pins : PEPin PEPin */
|
||
GPIO_InitStruct.Pin = Rev_Pin;
|
||
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
|
||
HAL_GPIO_Init(Rev_GPIO_Port, &GPIO_InitStruct);
|
||
|
||
}
|
||
|
||
|
||
|
||
/*AD7606硬件复位*/
|
||
void AD7606_Reset(void){
|
||
|
||
HAL_GPIO_WritePin(GPIOG, RESET_Pin|RANGE1_Pin, GPIO_PIN_RESET); //退出复位状态
|
||
|
||
HAL_GPIO_WritePin(GPIOG, RESET_Pin|RANGE1_Pin, GPIO_PIN_SET); //进入复位状态ESET复位高电平脉冲宽度最小50ns
|
||
HAL_GPIO_WritePin(GPIOG, RESET_Pin|RANGE1_Pin, GPIO_PIN_SET);
|
||
HAL_GPIO_WritePin(GPIOG, RESET_Pin|RANGE1_Pin, GPIO_PIN_SET);
|
||
HAL_GPIO_WritePin(GPIOG, RESET_Pin|RANGE1_Pin, GPIO_PIN_SET);
|
||
HAL_GPIO_WritePin(GPIOG, RESET_Pin|RANGE1_Pin, GPIO_PIN_SET);
|
||
|
||
HAL_GPIO_WritePin(GPIOG, RESET_Pin|RANGE1_Pin, GPIO_PIN_RESET); //退出复位状态
|
||
|
||
}
|
||
|
||
/*启动一次ADC转换*/
|
||
void AD7606_StartConvst(void){
|
||
|
||
HAL_GPIO_WritePin(CONVEST_GPIO_Port,CONVEST_Pin,GPIO_PIN_RESET); //拉低CONVEST
|
||
HAL_GPIO_WritePin(CONVEST_GPIO_Port,CONVEST_Pin,GPIO_PIN_RESET); //延时CONVST 高电平脉冲宽度和低电平脉冲宽度最短 25ns
|
||
HAL_GPIO_WritePin(CONVEST_GPIO_Port,CONVEST_Pin,GPIO_PIN_RESET);
|
||
|
||
HAL_GPIO_WritePin(CONVEST_GPIO_Port,CONVEST_Pin,GPIO_PIN_SET);
|
||
|
||
}
|
||
|
||
/*从FIFO读取数据*/
|
||
void AD7606_ReadNowAdc(void)
|
||
{
|
||
g_tAD7606.sNowAdc[0] = AD7606_RESULT1(); /* 读第1路样本 */
|
||
|
||
g_tAD7606.sNowAdc[1] = AD7606_RESULT1(); /* 读第2路样本 */
|
||
|
||
g_tAD7606.sNowAdc[2] = AD7606_RESULT1(); /* 读第3路样本 */
|
||
|
||
g_tAD7606.sNowAdc[3] = AD7606_RESULT1(); /* 读第4路样本 */
|
||
|
||
g_tAD7606.sNowAdc[4] = AD7606_RESULT1(); /* 读第5路样本 */
|
||
|
||
g_tAD7606.sNowAdc[5] = AD7606_RESULT1(); /* 读第6路样本 */
|
||
|
||
g_tAD7606.sNowAdc[6] = AD7606_RESULT1(); /* 读第7路样本 */
|
||
|
||
g_tAD7606.sNowAdc[7] = AD7606_RESULT1(); /* 读第8路样本 */
|
||
|
||
while(HAL_GPIO_ReadPin(BUSY2_GPIO_Port, BUSY2_Pin)==GPIO_PIN_SET);
|
||
g_tAD7606.sNowAdc[8] = AD7606_RESULT2(); /* 读第9路样本 */
|
||
|
||
g_tAD7606.sNowAdc[9] = AD7606_RESULT2(); /* 读第10路样本 */
|
||
|
||
g_tAD7606.sNowAdc[10] = AD7606_RESULT2(); /* 读第11路样本 */
|
||
|
||
g_tAD7606.sNowAdc[11] = AD7606_RESULT2(); /* 读第12路样本 */
|
||
// g_tAD7606.sNowAdc[12] = AD7606_RESULT2(); /* 读第13路样本 */
|
||
// g_tAD7606.sNowAdc[13] = AD7606_RESULT2(); /* 读第14路样本 */
|
||
// g_tAD7606.sNowAdc[14] = AD7606_RESULT2(); /* 读第15路样本 */
|
||
// g_tAD7606.sNowAdc[15] = AD7606_RESULT2(); /* 读第16路样本 */
|
||
}
|
||
|
||
|
||
/*开始采集*/
|
||
void AD7606_StartRecord(void)
|
||
{
|
||
// printf("AD7606_StartRecord\n");
|
||
AD7606_StopRecord();
|
||
|
||
RevNumFlag = 4;
|
||
ADNumFlag = 4;
|
||
|
||
AD7606_Reset(); /* 复位硬件 */
|
||
|
||
gtim_timx_int_init(ARR - 1, PCS - 1); /* T = 84 000 000 / (ARR * PCS) */
|
||
printf("PCS=%d,ARR=%d\r\n",PCS,ARR);
|
||
|
||
}
|
||
|
||
/*停止采集*/
|
||
void AD7606_StopRecord(void){
|
||
|
||
|
||
HAL_NVIC_DisableIRQ(GTIM_TIMX_INT_IRQn); /* 关闭定时器中断 */
|
||
HAL_GPIO_WritePin(CONVEST_GPIO_Port,CONVEST_Pin,GPIO_PIN_SET); /*CONVST输出高电平*/
|
||
}
|
||
|
||
/*定时采集程序*/
|
||
void AD7606_ISR(void)
|
||
{
|
||
|
||
// AD7606_Reset(); /* 复位硬件 */
|
||
AD7606_StartConvst(); /* 启动采样 */
|
||
|
||
while(HAL_GPIO_ReadPin(BUSY1_GPIO_Port, BUSY1_Pin) == GPIO_PIN_SET){} //等待采样完成
|
||
|
||
int8_t i =0 ;
|
||
// HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
|
||
|
||
/* 从FSMC总线读取数据 */
|
||
AD7606_ReadNowAdc();
|
||
|
||
for(i=0; i<12; i++){
|
||
|
||
DataArray[1028*i + ADNumFlag] = (g_tAD7606.sNowAdc[i]>>8);
|
||
DataArray[1028*i + ADNumFlag+1] = (g_tAD7606.sNowAdc[i]);
|
||
|
||
}
|
||
|
||
DataArray[1028*12 + RevNumFlag] = HAL_GPIO_ReadPin(Rev_GPIO_Port, Rev_Pin);
|
||
memset(g_tAD7606.sNowAdc, 0, sizeof(g_tAD7606.sNowAdc));
|
||
ADNumFlag += 2;
|
||
RevNumFlag += 1;
|
||
// HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
|
||
/* 采样512次之后,使用USB发送数据 */
|
||
if(ADNumFlag == 1028){
|
||
CDC_Transmit_HS(DataArray,13364);
|
||
|
||
ADNumFlag = 1028*13 +4;
|
||
RevNumFlag = 1028*13 + 4;
|
||
}
|
||
/* 采样512次之后,使用USB发送数据 */
|
||
if(ADNumFlag == 14392){
|
||
CDC_Transmit_HS(&DataArray[13364],13364);
|
||
|
||
ADNumFlag = 4;
|
||
RevNumFlag = 4;
|
||
}
|
||
|
||
}
|
||
|
||
|