更新:
1、电阻输出功能调试完成; 2、问题修复:ads1220和dac7811的SPI配置不同,应该使用不同的初始化程序; 3、电阻输出暂时使用了粗略的校准;
This commit is contained in:
parent
0acf4df459
commit
cd05491dd9
|
@ -40,6 +40,7 @@ static void ads1220_cs(cs_state_type state)
|
||||||
|
|
||||||
static void fun_ads1220_spi1_init(void)
|
static void fun_ads1220_spi1_init(void)
|
||||||
{
|
{
|
||||||
|
// 空闲电平为低,下降沿读取,SPI数据8位
|
||||||
// hspi1.Instance = SPI1;
|
// hspi1.Instance = SPI1;
|
||||||
// hspi1.Init.Mode = SPI_MODE_MASTER;
|
// hspi1.Init.Mode = SPI_MODE_MASTER;
|
||||||
// hspi1.Init.Direction = SPI_DIRECTION_2LINES;
|
// hspi1.Init.Direction = SPI_DIRECTION_2LINES;
|
||||||
|
@ -314,8 +315,8 @@ void ads1220_operation(uint8_t channel, float32 *data_pv)
|
||||||
}
|
}
|
||||||
|
|
||||||
ads1220_cs(CS_L);
|
ads1220_cs(CS_L);
|
||||||
//vTaskDelay(10);
|
vTaskDelay(10);
|
||||||
HAL_Delay(10);
|
//HAL_Delay(10);
|
||||||
// if (channel == CH2_OUT_CUR)
|
// if (channel == CH2_OUT_CUR)
|
||||||
// {
|
// {
|
||||||
// ads1220_reset();
|
// ads1220_reset();
|
||||||
|
@ -340,8 +341,8 @@ void ads1220_operation(uint8_t channel, float32 *data_pv)
|
||||||
// else if (channel == CH10_IN_TC)
|
// else if (channel == CH10_IN_TC)
|
||||||
// {
|
// {
|
||||||
ads1220_reset();
|
ads1220_reset();
|
||||||
HAL_Delay(5);
|
//HAL_Delay(5);
|
||||||
//vTaskDelay(5);
|
vTaskDelay(5);
|
||||||
setup_ads1220(
|
setup_ads1220(
|
||||||
ADS1220_MUX_AIN0_AIN1, // 输入多路复用器配置
|
ADS1220_MUX_AIN0_AIN1, // 输入多路复用器配置
|
||||||
ADS1220_OP_MODE_NORMAL, // 工作模式选择
|
ADS1220_OP_MODE_NORMAL, // 工作模式选择
|
||||||
|
@ -354,14 +355,14 @@ void ads1220_operation(uint8_t channel, float32 *data_pv)
|
||||||
ADS1220_IDAC_CURRENT_OFF, // IDAC电流设置
|
ADS1220_IDAC_CURRENT_OFF, // IDAC电流设置
|
||||||
ADS1220_VREF_EXT_REF0_PINS, // 基准电压选择*
|
ADS1220_VREF_EXT_REF0_PINS, // 基准电压选择*
|
||||||
ADS1220_TEMP_SENSOR_OFF); // 温度传感器
|
ADS1220_TEMP_SENSOR_OFF); // 温度传感器
|
||||||
//vTaskDelay(5);
|
vTaskDelay(5);
|
||||||
HAL_Delay(5);
|
//HAL_Delay(5);
|
||||||
ads1220_start();
|
ads1220_start();
|
||||||
HAL_Delay(30);
|
//HAL_Delay(30);
|
||||||
//vTaskDelay(30);
|
vTaskDelay(30);
|
||||||
ads1220_get_conversion_data(data_pv);
|
ads1220_get_conversion_data(data_pv);
|
||||||
// }
|
// }
|
||||||
ads1220_cs(CS_H);
|
ads1220_cs(CS_H);
|
||||||
//vTaskDelay(5);
|
vTaskDelay(5);
|
||||||
HAL_Delay(5);
|
//HAL_Delay(5);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,79 +10,92 @@ BOOL dac7811_spi_init_flag = FALSE;
|
||||||
|
|
||||||
void fun_dac7811_spi1_init()
|
void fun_dac7811_spi1_init()
|
||||||
{
|
{
|
||||||
// hspi1.Instance = SPI1;
|
//空闲电平为高,下降沿读取/写入,SPI数据16位
|
||||||
// hspi1.Init.Mode = SPI_MODE_MASTER;
|
hspi1.Instance = SPI1;
|
||||||
// hspi1.Init.Direction = SPI_DIRECTION_2LINES;
|
hspi1.Init.Mode = SPI_MODE_MASTER;
|
||||||
// hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
|
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
|
||||||
// hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
|
hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
|
||||||
// hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
|
hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
|
||||||
// hspi1.Init.NSS = SPI_NSS_SOFT;
|
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
|
||||||
// hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
|
hspi1.Init.NSS = SPI_NSS_SOFT;
|
||||||
// hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
|
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
|
||||||
// hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
|
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
|
||||||
// hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
|
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
|
||||||
// hspi1.Init.CRCPolynomial = 10;
|
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
|
||||||
// if (HAL_SPI_Init(&hspi1) != HAL_OK)
|
hspi1.Init.CRCPolynomial = 10;
|
||||||
// {
|
if (HAL_SPI_Init(&hspi1) != HAL_OK)
|
||||||
// Error_Handler();
|
{
|
||||||
// }
|
Error_Handler();
|
||||||
MX_SPI1_Init();
|
}
|
||||||
ADS1220_CS(GPIO_PIN_SET);
|
|
||||||
DAC7811_CS(GPIO_PIN_RESET);
|
ADS1220_CS(GPIO_PIN_SET);
|
||||||
|
DAC7811_CS(GPIO_PIN_RESET);
|
||||||
}
|
}
|
||||||
|
|
||||||
void fun_dac7811_operate(float32 *data_sv)
|
void fun_dac7811_operate(float32 *data_sv)
|
||||||
{
|
{
|
||||||
if (data_sv == NULL) return;
|
if (data_sv == NULL) return;
|
||||||
|
|
||||||
if(*data_sv > 4000)
|
if(*data_sv > 4000)
|
||||||
{
|
{
|
||||||
*data_sv = 4000;
|
*data_sv = 4000;
|
||||||
}
|
}
|
||||||
else if (*data_sv < 0)
|
else if (*data_sv < 0)
|
||||||
{
|
{
|
||||||
*data_sv = 0;
|
*data_sv = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
float32 temp = *data_sv;
|
float32 temp = *data_sv;
|
||||||
/**********在此处进行电阻输出(Ω)校准,temp为目标值**********/
|
/**********在此处进行电阻输出(Ω)校准,temp为目标值**********/
|
||||||
temp = calibrate_res_ohm_out(temp);
|
temp = calibrate_res_ohm_out(temp);
|
||||||
|
|
||||||
if(temp > 4000)
|
if(temp > 4000)
|
||||||
{
|
{
|
||||||
temp = 4000;
|
temp = 4000;
|
||||||
}
|
}
|
||||||
else if (temp < 0)
|
else if (temp < 0)
|
||||||
{
|
{
|
||||||
temp = 0;
|
temp = 0;
|
||||||
}
|
}
|
||||||
mux_signal.sv_calibrated = temp;
|
mux_signal.sv_calibrated = temp;
|
||||||
/**********************************************************/
|
/**********************************************************/
|
||||||
|
|
||||||
uint16_t reg_data = (uint16_t)(temp);
|
//实际输出与设定值之间存在倍数关系
|
||||||
reg_data |= 0x1000;
|
if(temp <= 1000)
|
||||||
reg_data &= 0x1fff;
|
{
|
||||||
|
temp /= 1.4f;
|
||||||
|
}
|
||||||
|
else if(temp <= 2000)
|
||||||
|
{
|
||||||
|
temp /= 1.2f;
|
||||||
|
}
|
||||||
|
else if(temp <= 3000)
|
||||||
|
{
|
||||||
|
temp /= 1.1f;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t reg_data = (uint16_t)(temp);
|
||||||
|
reg_data |= 0x1000;
|
||||||
|
reg_data &= 0x1fff;
|
||||||
|
|
||||||
|
if (dac7811_spi_init_flag == FALSE)
|
||||||
|
{
|
||||||
|
fun_dac7811_spi1_init();
|
||||||
|
ads1220_spi_init_flag = FALSE;
|
||||||
|
dac7811_spi_init_flag = TRUE;
|
||||||
|
vTaskDelay(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
DAC7811_CS(GPIO_PIN_RESET);
|
||||||
|
HAL_SPI_Transmit(&hspi1, (uint8_t *)(®_data), 1, 1000);
|
||||||
|
DAC7811_CS(GPIO_PIN_SET);
|
||||||
|
|
||||||
if (dac7811_spi_init_flag == FALSE)
|
|
||||||
{
|
|
||||||
fun_dac7811_spi1_init();
|
|
||||||
ads1220_spi_init_flag = FALSE;
|
|
||||||
dac7811_spi_init_flag = TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DAC7811_CS(GPIO_PIN_RESET);
|
|
||||||
vTaskDelay(100);
|
|
||||||
HAL_SPI_Transmit(&hspi1, (uint8_t *)(®_data), 1, 1000);
|
|
||||||
vTaskDelay(100);
|
|
||||||
DAC7811_CS(GPIO_PIN_SET);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t resohm_out_cal_enable = 0;
|
uint8_t resohm_out_cal_enable = 0;
|
||||||
float32 calibrate_res_ohm_out(float32 raw)
|
float32 calibrate_res_ohm_out(float32 raw)
|
||||||
{
|
{
|
||||||
float result = 0;
|
float result = 0;
|
||||||
|
|
||||||
switch (resohm_out_cal_enable)
|
switch (resohm_out_cal_enable)
|
||||||
{
|
{
|
||||||
|
|
|
@ -6,6 +6,12 @@
|
||||||
#define RTS_ON GPIO_PIN_RESET
|
#define RTS_ON GPIO_PIN_RESET
|
||||||
#define RTS_OFF GPIO_PIN_SET
|
#define RTS_OFF GPIO_PIN_SET
|
||||||
|
|
||||||
|
#define HART_24V_ENABLE HAL_GPIO_WritePin(RS_EN_GPIO_Port, RS_EN_Pin, GPIO_PIN_RESET)
|
||||||
|
#define HART_24V_DISABLE HAL_GPIO_WritePin(RS_EN_GPIO_Port, RS_EN_Pin, GPIO_PIN_SET)
|
||||||
|
|
||||||
|
#define HART_250OHM_ENABLE HAL_GPIO_WritePin(RP_EN_GPIO_Port, RP_EN_Pin, GPIO_PIN_RESET)
|
||||||
|
#define HART_250OHM_DISABLE HAL_GPIO_WritePin(RP_EN_GPIO_Port, RP_EN_Pin, GPIO_PIN_SET)
|
||||||
|
|
||||||
void hart_send(UART_HandleTypeDef *huart, uint8_t *data);
|
void hart_send(UART_HandleTypeDef *huart, uint8_t *data);
|
||||||
void hart_communicate(st_scom *scom);
|
void hart_communicate(st_scom *scom);
|
||||||
|
|
||||||
|
|
|
@ -280,8 +280,8 @@ void mux_signal_switch(st_mux_signal *mux_signal)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CH4_OUT_RES:
|
case CH4_OUT_RES:
|
||||||
//if(mux_set_flag) fun_dac7811_operate(&mux_signal->data_sv); //设定
|
if(mux_set_flag) fun_dac7811_operate(&mux_signal->data_sv); //设定
|
||||||
fun_dac7811_operate(&mux_signal->data_sv);
|
//fun_dac7811_operate(&mux_signal->data_sv);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CH5_EMPTY:
|
case CH5_EMPTY:
|
||||||
|
|
|
@ -217,32 +217,57 @@ void start_task_hart(void const * argument)
|
||||||
/* Infinite loop */
|
/* Infinite loop */
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
//该任务用于设置HART芯片所需频率、驱动验证
|
if( (fre_set_hart != 460800)&&(tabdata.hart_enable) )
|
||||||
if(tabdata.hart_enable == 1)
|
|
||||||
{
|
{
|
||||||
if(fre_set_hart != 460800)
|
fre_set_hart = 460800;
|
||||||
{
|
frequence_output(fre_set_hart, 50, PWM_HART);
|
||||||
fre_set_hart = 460800;
|
|
||||||
frequence_output(fre_set_hart, 50, PWM_HART);
|
|
||||||
}
|
|
||||||
|
|
||||||
//驱动验证,DEVICE <--- HART ---> SIG
|
|
||||||
if(hart_test == 1)
|
|
||||||
{
|
|
||||||
hart_test = 0;
|
|
||||||
|
|
||||||
scom1_hart.tx_flag = TRUE;
|
|
||||||
hart_communicate(&scom1_hart);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
switch (tabdata.hart_enable)
|
||||||
{
|
{
|
||||||
if(fre_set_hart != 0)
|
case HART_DISABLE:
|
||||||
{
|
{
|
||||||
fre_set_hart = 0;
|
if(fre_set_hart != 0)
|
||||||
frequence_output(fre_set_hart, 50, PWM_HART);
|
{
|
||||||
|
fre_set_hart = 0;
|
||||||
|
frequence_output(fre_set_hart, 50, PWM_HART);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HART_LISTEN:
|
||||||
|
{
|
||||||
|
HART_24V_DISABLE;
|
||||||
|
HART_250OHM_DISABLE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HART_INTERNAL_24V:
|
||||||
|
{
|
||||||
|
HART_24V_ENABLE;
|
||||||
|
HART_250OHM_DISABLE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HART_INTERNAL_250OHM:
|
||||||
|
{
|
||||||
|
HART_250OHM_ENABLE;
|
||||||
|
HART_24V_DISABLE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//驱动验证,DEVICE <--- HART ---> SIG
|
||||||
|
// if(hart_test == 1)
|
||||||
|
// {
|
||||||
|
// hart_test = 0;
|
||||||
|
|
||||||
|
// scom1_hart.tx_flag = TRUE;
|
||||||
|
// hart_communicate(&scom1_hart);
|
||||||
|
// }
|
||||||
|
|
||||||
system_sts.hart_stack_consume = HART_STACK_SIZE_WORD - uxTaskGetStackHighWaterMark(NULL);
|
system_sts.hart_stack_consume = HART_STACK_SIZE_WORD - uxTaskGetStackHighWaterMark(NULL);
|
||||||
osDelay(HART_TASK_PERIOD);
|
osDelay(HART_TASK_PERIOD);
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue