更新:

1、频率输入正常(两个校准器,一个输出一个输入,0-100KHz,误差1Hz左右);
2、热电偶和电阻输出功能调试完毕(将DAC7811的MISO断开后,两者能够共同工作);
3、modbus寄存器更新逻辑调整:新增upper_control_flag变量,初始为0,收到“写”命令后置1,寄存器更新后置0;
This commit is contained in:
吴俊潮 2025-07-30 11:31:51 +08:00
parent cd05491dd9
commit 46cc2f2021
11 changed files with 22219 additions and 22209 deletions

View File

@ -12,20 +12,6 @@ long ADS1220RTDGainCorrection = 1;
long ADS1220TCGainCorrection = 1;
BOOL ads1220_spi_init_flag = FALSE;
// void test1()
// {
// static uint32_t count = 0;
// while(1)
// {
// count = 10000;
// HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET);
// while(!(count--));
// HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_RESET);
// }
// }
static void ads1220_cs(cs_state_type state)
{
if (state == CS_L)
@ -71,6 +57,7 @@ static void fun_ads1220_spi1_init(void)
// {
// HAL_SPI_TransmitReceive(&hspi1, pTxData, pRxData, 1, 1000);
// }
HAL_StatusTypeDef ads1220spi_status_watch;
static void spi_write_read(uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)
{
@ -257,22 +244,13 @@ static void ads1220_start(void)
// uint8_t cmd = ADS1220_POWERDOWN_CMD;
// spi_write_read(&cmd, RcvData, 1);
//}
uint8_t in_data_1220[3] = {0};
int data_1220_raw = 0;
long data_1220 = 0;
static void ads1220_get_conversion_data(float32 *conversionData)
{
uint8_t out_data[3] = {0xff, 0xff, 0xff};
// uint8_t in_data[3] = {0};
// long data = 0;
// spi_write_read(out_data, in_data, 3);
// data = (((long)in_data[0] << 16) + ((long)in_data[1] << 8) + (long)in_data[2]);
// if (data & 0x800000)
// {
// data ^= 0x00FFFFFF;
// data += 1;
// }
spi_write_read(out_data, in_data_1220, 3);
data_1220_raw = data_1220;
@ -316,53 +294,66 @@ void ads1220_operation(uint8_t channel, float32 *data_pv)
ads1220_cs(CS_L);
vTaskDelay(10);
//HAL_Delay(10);
// if (channel == CH2_OUT_CUR)
// {
// ads1220_reset();
// vTaskDelay(5);
// setup_ads1220(
// ADS1220_MUX_AIN2_AVSS, // 输入多路复用器配置
// ADS1220_OP_MODE_NORMAL, // 工作模式选择
// ADS1220_CONVERSION_SINGLE_SHOT, // 转换模式
// ADS1220_DATA_RATE_45SPS, // 数据速率
// ADS1220_GAIN_1, // 增益配置
// ADS1220_PGA_BYPASS, // 禁止/启用可编程增益放大器
// ADS1220_IDAC1_DISABLED, // 选择IDAC1将路由到的通道
// ADS1220_IDAC2_DISABLED, // 选择IDAC2将路由到的通道
// ADS1220_IDAC_CURRENT_OFF, // IDAC电流设置
// ADS1220_VREF_EXT_REF0_PINS, // 基准电压选择
// ADS1220_TEMP_SENSOR_OFF); // 温度传感器
// vTaskDelay(5);
// ads1220_start();
// vTaskDelay(30);
// ads1220_get_conversion_data(data_pv);
// }
// else if (channel == CH10_IN_TC)
// {
ads1220_reset();
//HAL_Delay(5);
vTaskDelay(5);
setup_ads1220(
ADS1220_MUX_AIN0_AIN1, // 输入多路复用器配置
ADS1220_OP_MODE_NORMAL, // 工作模式选择
ADS1220_CONVERSION_SINGLE_SHOT, // 转换模式*
ADS1220_DATA_RATE_45SPS, // 数据速率*
ADS1220_GAIN_1, // 增益配置*
ADS1220_PGA_BYPASS, // 禁止/启用可编程增益放大器
ADS1220_IDAC1_DISABLED, // 选择IDAC1将路由到的通道
ADS1220_IDAC2_DISABLED, // 选择IDAC2将路由到的通道
ADS1220_IDAC_CURRENT_OFF, // IDAC电流设置
ADS1220_VREF_EXT_REF0_PINS, // 基准电压选择*
ADS1220_TEMP_SENSOR_OFF); // 温度传感器
vTaskDelay(5);
//HAL_Delay(5);
ads1220_start();
//HAL_Delay(30);
vTaskDelay(30);
ads1220_get_conversion_data(data_pv);
// }
ads1220_reset();
//HAL_Delay(5);
vTaskDelay(5);
setup_ads1220(
ADS1220_MUX_AIN0_AIN1, // 输入多路复用器配置
ADS1220_OP_MODE_NORMAL, // 工作模式选择
ADS1220_CONVERSION_SINGLE_SHOT, // 转换模式*
ADS1220_DATA_RATE_45SPS, // 数据速率*
ADS1220_GAIN_1, // 增益配置*
ADS1220_PGA_BYPASS, // 禁止/启用可编程增益放大器
ADS1220_IDAC1_DISABLED, // 选择IDAC1将路由到的通道
ADS1220_IDAC2_DISABLED, // 选择IDAC2将路由到的通道
ADS1220_IDAC_CURRENT_OFF, // IDAC电流设置
ADS1220_VREF_EXT_REF0_PINS, // 基准电压选择*
ADS1220_TEMP_SENSOR_OFF); // 温度传感器
vTaskDelay(5);
//HAL_Delay(5);
ads1220_start();
//HAL_Delay(30);
vTaskDelay(30);
ads1220_get_conversion_data(data_pv);
ads1220_cs(CS_H);
vTaskDelay(5);
//HAL_Delay(5);
}
// void simulate_SPI_WriteReadByte(uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)
// {
// uint8_t i = 0, j = 0;
// uint8_t temp = 0, data = 0;
// for(j = 0; j < Size; j++)
// {
// data = pTxData[j];
// for(i = 0; i < 8; i++)
// {
// temp = ((data&0x80) == 0x80)? 1:0;
// data = data << 1;
// read_data = read_data << 1;
// SPI_CLK(0);
// SPI_MOSI(temp);
// delay_cnt(10);
// SPI_CLK(1);
// delay_cnt(10);
// if(SPI_MISO()==1)
// {
// read_data = read_data + 1;
// }
// SPI_CLK(0);
// }
// }
// }

View File

@ -759,26 +759,6 @@ void input_value_show(void)
void io_on2off_status(void)
{
switch (tabdata.item3_page0_language)
{
case MENU_SIMPLYFY_CHINESE:
{
lv_label_set_text(guider_ui.screen_main_label_IN, "输入:");
lv_label_set_text(guider_ui.screen_main_label_OUT, "输出:");
}
break;
case MENU_ENGLISH:
{
lv_label_set_text(guider_ui.screen_main_label_IN, "IN:");
lv_label_set_text(guider_ui.screen_main_label_OUT, "OUT:");
}
break;
default:
break;
}
switch (menu_data.io_on2off)
{
case IO_ON:
@ -848,6 +828,26 @@ void io_on2off_status(void)
default:
break;
}
switch (tabdata.item3_page0_language)
{
case MENU_SIMPLYFY_CHINESE:
{
lv_label_set_text(guider_ui.screen_main_label_IN, "输入:");
lv_label_set_text(guider_ui.screen_main_label_OUT, "输出:");
}
break;
case MENU_ENGLISH:
{
lv_label_set_text(guider_ui.screen_main_label_IN, "IN:");
lv_label_set_text(guider_ui.screen_main_label_OUT, "OUT:");
}
break;
default:
break;
}
}
void scr_main_recover(void)

View File

@ -384,36 +384,36 @@ void sig_channel_select(uint8_t io, SIG_FUNCTIONS_TYPE type)
// uint16_t uit_test_l = 0, uit_test_h = 0;
void sig_sv_update(void)
{
if(progout_data.process == PROGOUT_WAITING)
if( !get_coil_val(COIL_ADDR_HOLD_SV_CTRL) )
{
//按键修改屏幕上的设定值 -> 将屏幕上的值转化成实际值 -> 实际值再转化成mux输入值
switch (menu_data.io_on2off)
if(progout_data.process == PROGOUT_WAITING)
{
case IO_ON:
//按键修改屏幕上的设定值 -> 将屏幕上的值转化成实际值 -> 实际值再转化成mux输入值
switch (menu_data.io_on2off)
{
mux_signal.data_sv = real2mux( get_output_value() );
}
break;
case IO_ON:
{
mux_signal.data_sv = real2mux( get_output_value() );
}
break;
case IO_OFF:
{
mux_signal.data_sv = 0;
case IO_OFF:
{
mux_signal.data_sv = 0;
}
break;
default:
break;
}
break;
default:
break;
}
}
else
{
program_out_run();
set_output( mux2real(mux_signal.data_sv) );
}
else
{
program_out_run();
set_output( mux2real(mux_signal.data_sv) );
}
//本地控制的情况下,保持寄存器的值跟随设定值变化
if(get_coil_val(COIL_ADDR_HOLD_SV_CTRL) == 0)
{
//本地控制的情况下,保持寄存器的值跟随设定值变化
HoldReg[HOLD_ADDR_MUX_SV_H] = ( (uint32_t)mux2real(mux_signal.data_sv) ) >> 16;
HoldReg[HOLD_ADDR_MUX_SV_L] = ( (uint32_t)mux2real(mux_signal.data_sv) ) & 0x0000FFFF;
}

View File

@ -44,8 +44,8 @@ uint8_t ble_init(void)
{
if(ble_cnt == 0)
{
char ble_id[9];
strcpy (ble_id, "00000001");
char ble_id[32];
strcpy (ble_id, "GSDT_Signal_Generator_V1.0");
write_ble_id(ble_id); //修改蓝牙名称
ble_cnt++;

View File

@ -18,6 +18,7 @@ extern uint32_t tick_end;
extern uint32_t trans_log_tx;
extern uint8_t sig2slave_step;
extern TRANS_PROCESS st_flag;
extern uint8_t upper_control_flag;
void parse_scom_485(st_scom *scom);

View File

@ -6,6 +6,7 @@ uint32_t tick_end = 0;
//uint32_t trans_log_rx = 0;
uint32_t trans_log_tx = 0;
TRANS_PROCESS st_flag = TRANSPARENT_WAIT;
uint8_t upper_control_flag = 0; //modbus协议处理中执行写入功能时令 upper_control_flag = 1
void parse_scom_485(st_scom *scom)

View File

@ -14,6 +14,8 @@ void modbus_registers_update(void)
//输入寄存器
modbus_reg_update_input();
upper_control_flag = 0;
}
//线圈寄存器,读写
@ -83,10 +85,10 @@ uint8_t get_coil_val(uint8_t addr)
void coil_deal_ON2OFF(void)
{
if( (get_coil_val(COIL_ADDR_ON_OFF) != menu_data.io_on2off)&&(get_coil_val(COIL_ADDR_ON_OFF) < 2) )
if(get_coil_val(COIL_ADDR_ON_OFF) != menu_data.io_on2off)
{
//进入此处说明线圈寄存器的值被上位机修改
if( menu_data.scr_now == SCREEN_MAIN )
if( (menu_data.scr_now == SCREEN_MAIN)&&(upper_control_flag) )
{
//只有在主界面时,修改内容才生效
menu_data.io_on2off = get_coil_val(COIL_ADDR_ON_OFF);
@ -102,31 +104,39 @@ void coil_deal_ON2OFF(void)
void coil_deal_light(void)
{
if( (get_coil_val(COIL_ADDR_LIGHT) != tabdata.item3_page0_lightflag)&&(get_coil_val(COIL_ADDR_LIGHT) < 2) )
if(get_coil_val(COIL_ADDR_LIGHT) != tabdata.item3_page0_lightflag)
{
//进入此处说明线圈寄存器的值被上位机修改
tabdata.item3_page0_lightflag = get_coil_val(COIL_ADDR_LIGHT);
if(tabdata.item3_page0_lightflag)
if(upper_control_flag)
{
LIGHT_ON;
tabdata.item3_page0_lightflag = get_coil_val(COIL_ADDR_LIGHT);
if(tabdata.item3_page0_lightflag)
{
LIGHT_ON;
}
else
{
LIGHT_OFF;
}
//如果当前页面存在该内容,则更新文本
if( (menu_data.scr_now == SCREEN_SETTING)&&(tabdata.item_cursor == ITEM_3) ) set_item3_text(LIGHT_STATUS);
}
else
{
LIGHT_OFF;
set_coil_val(COIL_ADDR_LIGHT, tabdata.item3_page0_lightflag);
}
//如果当前页面存在该内容,则更新文本
if( (menu_data.scr_now == SCREEN_SETTING)&&(tabdata.item_cursor == ITEM_3) ) set_item3_text(LIGHT_STATUS);
}
}
void coil_deal_save(void)
{
if( (get_coil_val(COIL_ADDR_CONFIG_SAVE) == 1)&&(tabdata.item3_page0_saveflag == 0) )
if( get_coil_val(COIL_ADDR_CONFIG_SAVE) != tabdata.item3_page0_saveflag )
{
if( (menu_data.scr_now == SCREEN_SETTING)&&(tabdata.item3_page0_resetflag != 1) )
if( (upper_control_flag)&&(tabdata.item3_page0_resetflag != 1)&&(tabdata.item3_page0_saveflag == 0)\
&&(get_coil_val(COIL_ADDR_CONFIG_SAVE))&&(menu_data.scr_now == SCREEN_SETTING) )
{
//当前处于设置界面,并且未处于重置过程中,执行保存
//上位机控制、未处于复位过程、未保存、需要保存、当前位于设置界面时,才能执行保存
tabdata.item3_page0_saveflag = 1;
}
else
@ -139,11 +149,12 @@ void coil_deal_save(void)
void coil_deal_reset(void)
{
if( (get_coil_val(COIL_ADDR_CONFIG_RESET) == 1)&&(tabdata.item3_page0_resetflag == 0) )
if( get_coil_val(COIL_ADDR_CONFIG_RESET) != tabdata.item3_page0_resetflag )
{
if( (menu_data.scr_now == SCREEN_SETTING)&&(tabdata.item3_page0_saveflag != 1) )
if( (upper_control_flag)&&(tabdata.item3_page0_saveflag != 1)&&(tabdata.item3_page0_resetflag == 0)\
&&(get_coil_val(COIL_ADDR_CONFIG_RESET))&&(menu_data.scr_now == SCREEN_SETTING) )
{
//当前处于设置界面,并且未处于保存过程中,执行复位
//上位机控制、未处于保存过程、未复位、需要复位、当前位于设置界面时,才能执行复位
tabdata.item3_page0_resetflag = 1;
}
else
@ -261,7 +272,7 @@ void hold_deal_set_work_mode(void)
if( (HoldReg[HOLD_ADDR_SET_WORK_MODE] != work_mode_pv)&&(0 < HoldReg[HOLD_ADDR_SET_WORK_MODE])&&(HoldReg[HOLD_ADDR_SET_WORK_MODE] <= 28) )
{
//只有在主界面才接受修改
if(menu_data.scr_now == SCREEN_MAIN)
if( (menu_data.scr_now == SCREEN_MAIN)&&(upper_control_flag) )
{
SIG_FUNCTIONS iom;
SIG_FUNCTIONS_TYPE iomt;
@ -323,14 +334,16 @@ void hold_deal_set_work_mode(void)
void hold_deal_muxsv(void)
{
if( !get_coil_val(COIL_ADDR_HOLD_SV_CTRL) ) return;
//上位机控制的情况下,设定值跟随保持寄存器的值变化
uint32_t hold_temp = (HoldReg[HOLD_ADDR_MUX_SV_H] << 16) + HoldReg[HOLD_ADDR_MUX_SV_L];
float32 real_hold = 0;
memcpy(&real_hold, &hold_temp, 4);
if( (real2mux(real_hold) != mux_signal.data_sv)&&get_coil_val(COIL_ADDR_HOLD_SV_CTRL)&&get_coil_val(COIL_ADDR_HOLD_SV_ENSURE) )
if( (real2mux(real_hold) != mux_signal.data_sv)&&get_coil_val(COIL_ADDR_HOLD_SV_ENSURE) )
{
if( (menu_data.scr_now == SCREEN_MAIN)&&(pltdata.yreal_pri_low <= real_hold)&&(real_hold <= pltdata.yreal_pri_up) )
if( (upper_control_flag)&&(menu_data.scr_now == SCREEN_MAIN)&&(pltdata.yreal_pri_low <= real_hold)&&(real_hold <= pltdata.yreal_pri_up) )
{
set_output(real_hold);
}
@ -515,7 +528,7 @@ void hold_deal_range_max(void)
if( (!p8up)|(!p8low) ) return;
uint8_t hold_temp8 = 0x00FF & HoldReg[HOLD_ADDR_PHY_UP];
if( (*p8low <= hold_temp8)&&(hold_temp8 <= (uint8_t)rg_max) )
if( (*p8low <= hold_temp8)&&(hold_temp8 <= (uint8_t)rg_max)&&(upper_control_flag) )
{
*p8up = hold_temp8;
*p8up_prv = *p8up;
@ -546,7 +559,7 @@ void hold_deal_range_max(void)
int16_t hold_temp16 = 0;
memcpy(&hold_temp16, HoldReg + HOLD_ADDR_PHY_UP, 2);
if( (*p16low <= hold_temp16)&&(hold_temp16 <= rg_max) )
if( (*p16low <= hold_temp16)&&(hold_temp16 <= rg_max)&&(upper_control_flag) )
{
*p16up = hold_temp16;
*p16up_prv = *p16up;
@ -597,7 +610,7 @@ void hold_deal_range_min(void)
if( (!p8up)|(!p8low) ) return;
uint8_t hold_temp8 = 0x00FF & HoldReg[HOLD_ADDR_PHY_LOW];
if( ((uint8_t)rg_min <= hold_temp8)&&(hold_temp8 <= *p8up) )
if( ((uint8_t)rg_min <= hold_temp8)&&(hold_temp8 <= *p8up)&&(upper_control_flag) )
{
*p8low = hold_temp8;
if(menu_data.scr_now == SCREEN_MAIN)
@ -626,7 +639,7 @@ void hold_deal_range_min(void)
int16_t hold_temp16 = 0;
memcpy(&hold_temp16, HoldReg + HOLD_ADDR_PHY_LOW, 2);
if( (rg_min <= hold_temp16)&&(hold_temp16 <= *p16up) )
if( (rg_min <= hold_temp16)&&(hold_temp16 <= *p16up)&&(upper_control_flag) )
{
*p16low = hold_temp16;
@ -658,7 +671,7 @@ void hold_deal_sample_interval(void)
if( HoldReg[HOLD_ADDR_SAMPLE_INTERVAL] != tabdata.item1_page0_sample_interval )
{
if( (MENU_TASK_PERIOD <= HoldReg[HOLD_ADDR_SAMPLE_INTERVAL])&&(HoldReg[HOLD_ADDR_SAMPLE_INTERVAL] <= SAMPLE_INTERVAL_MAX) )
if( (MENU_TASK_PERIOD <= HoldReg[HOLD_ADDR_SAMPLE_INTERVAL])&&(HoldReg[HOLD_ADDR_SAMPLE_INTERVAL] <= SAMPLE_INTERVAL_MAX)&&(upper_control_flag) )
{
tabdata.item1_page0_sample_interval = HoldReg[HOLD_ADDR_SAMPLE_INTERVAL];
@ -679,7 +692,7 @@ void hold_deal_plot_counts(void)
if( HoldReg[HOLD_ADDR_PLOT_COUNTS] != (0x00FF & tabdata.item1_page0_plot_num) )
{
if( (PLOT_NUM_MIN <= HoldReg[HOLD_ADDR_PLOT_COUNTS])&&(HoldReg[HOLD_ADDR_PLOT_COUNTS] <= PLOT_NUM_MAX) )
if( (PLOT_NUM_MIN <= HoldReg[HOLD_ADDR_PLOT_COUNTS])&&(HoldReg[HOLD_ADDR_PLOT_COUNTS] <= PLOT_NUM_MAX)&&(upper_control_flag) )
{
tabdata.item1_page0_plot_num = 0x00FF & HoldReg[HOLD_ADDR_PLOT_COUNTS];
@ -710,7 +723,7 @@ void hold_deal_color_input(void)
if( HoldReg[HOLD_ADDR_INPUT_COLOR] != (0x00FF & (uint8_t)tabdata.item1_page0_color_input) )
{
if( HoldReg[HOLD_ADDR_INPUT_COLOR] <= 5 )
if( (HoldReg[HOLD_ADDR_INPUT_COLOR] <= 5)&&(upper_control_flag) )
{
tabdata.item1_page0_color_input = (COLORS)HoldReg[HOLD_ADDR_INPUT_COLOR];
@ -738,7 +751,7 @@ void hold_deal_color_output(void)
if( HoldReg[HOLD_ADDR_OUTPUT_COLOR] != (0x00FF & (uint8_t)tabdata.item1_page0_color_output) )
{
if( HoldReg[HOLD_ADDR_OUTPUT_COLOR] <= 5 )
if( (HoldReg[HOLD_ADDR_OUTPUT_COLOR] <= 5)&&(upper_control_flag) )
{
tabdata.item1_page0_color_output = (COLORS)HoldReg[HOLD_ADDR_OUTPUT_COLOR];
@ -766,7 +779,7 @@ void hold_deal_language_select(void)
if( HoldReg[HOLD_ADDR_LANGUAGE] != (0x00FF & (uint8_t)tabdata.item3_page0_language) )
{
if( HoldReg[HOLD_ADDR_LANGUAGE] <= 1 )
if( (HoldReg[HOLD_ADDR_LANGUAGE] <= 1)&&(upper_control_flag) )
{
tabdata.item3_page0_language = (LANGUAGES)HoldReg[HOLD_ADDR_LANGUAGE];

View File

@ -46,22 +46,26 @@ void modbus_analysis_rtu(uint8_t * upRxdbuf, uint16_t wRxdLen)
case WriteSingleReg:
writesinglereg_rtu(upRxdbuf + 2, wRxdLen - 2); // 写单个寄存器
upper_control_flag = 1;
break;
case WriteMultiCoil:
writemulticoil_rtu(upRxdbuf + 2, wRxdLen - 2); // 写多个线圈
upper_control_flag = 1;
break;
case WriteMultiReg:
writemultireg_rtu(upRxdbuf + 2, wRxdLen - 2); // 写多个寄存器
upper_control_flag = 1;
break;
case WriteSingleCoil:
writesinglecoil_rtu(upRxdbuf + 2, wRxdLen - 2); // 写单个线圈
upper_control_flag = 1;
break;
default:
modbus_errfunction_rtu(upRxdbuf[1], 0x01); // 错误码处理
modbus_errfunction_rtu(upRxdbuf[1], 0x01); // 错误码处理
break;
}
}

View File

@ -332,7 +332,7 @@ void start_rs485(void const * argument)
}
//更新modbus的寄存器值
//开机动画结束后再执行
//开机动画结束后再执行否则会与数据初始化中的EEPROM读取产生冲突
if(menu_data.scr_init_flag == 1)
{
modbus_registers_update();

View File

@ -270,21 +270,6 @@
<WinNumber>1</WinNumber>
<ItemText>cali_paras</ItemText>
</Ww>
<Ww>
<count>23</count>
<WinNumber>1</WinNumber>
<ItemText>in_data_1220</ItemText>
</Ww>
<Ww>
<count>24</count>
<WinNumber>1</WinNumber>
<ItemText>data_1220_raw</ItemText>
</Ww>
<Ww>
<count>25</count>
<WinNumber>1</WinNumber>
<ItemText>data_1220</ItemText>
</Ww>
</WatchWindow1>
<WatchWindow2>
<Ww>

File diff suppressed because it is too large Load Diff