更新:

1、电阻输出功能调试完成;
2、问题修复:ads1220和dac7811的SPI配置不同,应该使用不同的初始化程序;
3、电阻输出暂时使用了粗略的校准;
This commit is contained in:
吴俊潮 2025-07-29 17:21:57 +08:00
parent 0acf4df459
commit cd05491dd9
7 changed files with 19578 additions and 23166 deletions

View File

@ -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);
} }

View File

@ -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 *)(&reg_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 *)(&reg_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)
{ {

View File

@ -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);

View File

@ -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:

View File

@ -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