sggt/App/MUX_SIGNAL/mux_signal.c

541 lines
16 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @Author: wujunchao wujunchao@wuxismart.com
* @Date: 2024-12-24 08:18:26
* @LastEditors: wujunchao wujunchao@wuxismart.com
* @LastEditTime: 2025-03-20 15:01:22
* @FilePath: \signal_generator\App\MUX_SIGNAL\mux_signal.c
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
/*
* @Author: DaMingSY zxm5337@163.com
* @Date: 2024-09-02 15:58:58
* @LastEditors: DaMingSY zxm5337@163.com
* @LastEditTime: 2024-11-28 10:21:04
* @FilePath: \signal_generator\App\MUX_SIGNAL\mux_signal.c
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
#include "FreeRTOS.h"
#include "task.h"
#include "tim.h"
#include "mux_signal.h"
#include "adc.h"
st_mux_signal mux_signal = {
.channel = CHX_IN_MAX,
};
st_freq_signal freq_signal;
CALIBRATE_PARAGRAMS cali_paras;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (&htim3 == htim)
{
if (freq_signal.capture_cnt >= 1)
{
HAL_TIM_IC_Stop_IT(&htim3, TIM_CHANNEL_4);
}
freq_signal.capture_buf[freq_signal.capture_cnt++] = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_4); // 获取当前的捕获值.
}
}
void fun_get_freq(st_freq_signal *freq_signal, float *data_pv)
{
if (!freq_signal || !data_pv)
return;
if (freq_signal->capture_cnt >= 1)
{
freq_signal->capture_cnt = 0;
__HAL_TIM_SET_COUNTER(&htim3, 0);
// freq_signal->duty_time = freq_signal->capture_buf[1] + freq_signal->over_cnt * 60000 - freq_signal->capture_buf[0];
// freq_signal->freq = 1000000 / freq_signal->duty_time;
freq_signal->duty_time = freq_signal->capture_buf[1] + freq_signal->over_cnt * 65535 - freq_signal->capture_buf[0];
freq_signal->freq = 82944000 / freq_signal->duty_time;
*data_pv = freq_signal->freq;
freq_signal->over_cnt = 0;
}
else
{
HAL_TIM_Base_Start_IT(&htim3);
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_4);
}
}
void hc138_channel_test(void)
{
uint8_t i;
for (i = 0; i < 10; i++)
{
//HC138_SEL_CH(i);
vTaskDelay(3000);
}
vTaskDelay(3000);
}
void pwr_cosume(BOOL rst, uint32_t ms)
{
if (rst == TRUE || mux_signal.pwr_delay == 0)
mux_signal.pwr_delay = xTaskGetTickCount();
if (mux_signal.pwr_delay + ms > xTaskGetTickCount())
return;
else
mux_signal.pwr_delay = xTaskGetTickCount();
PWR_CTRL(GPIO_PIN_RESET);
vTaskDelay(250);
PWR_CTRL(GPIO_PIN_SET);
vTaskDelay(250);
PWR_CTRL(GPIO_PIN_RESET);
vTaskDelay(250);
PWR_CTRL(GPIO_PIN_SET);
vTaskDelay(250);
PWR_CTRL(GPIO_PIN_RESET);
}
// static void fun_pwr12_ctrl(uint8_t ch)
// {
// static uint8_t lasht_ch;
// BOOL ch_flag = FALSE;
// if (ch != lasht_ch)
// {
// ch_flag = TRUE;
// lasht_ch = ch;
// }
// if (ch_flag == TRUE)
// {
// ch_flag = FALSE;
// //if ((ch == CH0_OUT_VOL_V) || (ch == CH2_OUT_CUR) || (ch == CH3_OUT_FRE) || (ch == CH4_OUT_RES))
// //PWR12_CTRL(GPIO_PIN_SET);
// //else
// //PWR12_CTRL(GPIO_PIN_RESET);
// }
// }
CALIBRATE_FLAGS cal_flags = CAL_FLAG_NONE;
void deal_calibrate_affair(void)
{
if( cal_flags == CAL_FLAG_NONE ) return;
switch (cal_flags)
{
case CAL_FLAG_CUR_MA_OUT:
{
//存入cur_ma_out_calibrate_table[CALIBRATE_CUR_MA_OUT_POINTS]的数据
eeprom_datasave_single(EEPROM_TAG_CAL_CUR_MA_OUT);
//写入0xAAAA标志
eeprom_writedata(CAL_CUR_MA_OUT_ADDR_FLAG, 0xAA);
eeprom_writedata(CAL_CUR_MA_OUT_ADDR_FLAG + 8, 0xAA);
}
break;
case CAL_FLAG_VOUT_V_OUT:
{
//存入vol_v_out_calibrate_table[CALIBRATE_VOL_V_OUT_POINTS]的数据
eeprom_datasave_single(EEPROM_TAG_CAL_VOL_V_OUT);
//写入0xAAAA标志
eeprom_writedata(CAL_VOL_V_OUT_ADDR_FLAG, 0xAA);
eeprom_writedata(CAL_VOL_V_OUT_ADDR_FLAG + 8, 0xAA);
}
break;
case CAL_FLAG_VOUT_MV_OUT:
{
//存入vol_mv_out_calibrate_table[CALIBRATE_VOL_MV_OUT_POINTS]的数据
eeprom_datasave_single(EEPROM_TAG_CAL_VOL_MV_OUT);
//写入0xAAAA标志
eeprom_writedata(CAL_VOL_MV_OUT_ADDR_FLAG, 0xAA);
eeprom_writedata(CAL_VOL_MV_OUT_ADDR_FLAG + 8, 0xAA);
}
break;
case CAL_FLAG_RES_OHM_OUT:
{
//存入res_ohm_out_calibrate_table[CALIBRATE_RES_OHM_OUT_POINTS]的数据
eeprom_datasave_single(EEPROM_TAG_CAL_RES_OHM_OUT);
//写入0xAAAA标志
eeprom_writedata(CAL_RES_OHM_OUT_ADDR_FLAG, 0xAA);
eeprom_writedata(CAL_RES_OHM_OUT_ADDR_FLAG + 8, 0xAA);
}
break;
case CAL_FLAG_CUR_MA_IN:
{
//存入cur_ma_in_calibrate_table[CALIBRATE_CUR_MA_IN_POINTS]的数据
eeprom_datasave_single(EEPROM_TAG_CAL_CUR_MA_IN);
//写入0xAAAA标志
eeprom_writedata(CAL_CUR_MA_IN_ADDR_FLAG, 0xAA);
eeprom_writedata(CAL_CUR_MA_IN_ADDR_FLAG + 8, 0xAA);
}
break;
case CAL_FLAG_VOUT_V_IN:
{
//存入vol_v_in_calibrate_table[CALIBRATE_VOL_V_IN_POINTS]的数据
eeprom_datasave_single(EEPROM_TAG_CAL_VOL_V_IN);
//写入0xAAAA标志
eeprom_writedata(CAL_VOL_V_IN_ADDR_FLAG, 0xAA);
eeprom_writedata(CAL_VOL_V_IN_ADDR_FLAG + 8, 0xAA);
}
break;
case CAL_FLAG_VOUT_MV_IN:
{
//存入vol_mv_in_calibrate_table[CALIBRATE_VOL_MV_IN_POINTS]的数据
eeprom_datasave_single(EEPROM_TAG_CAL_VOL_MV_IN);
//写入0xAAAA标志
eeprom_writedata(CAL_VOL_MV_IN_ADDR_FLAG, 0xAA);
eeprom_writedata(CAL_VOL_MV_IN_ADDR_FLAG + 8, 0xAA);
}
break;
case CAL_FLAG_RES_OHM_IN:
{
//存入res_ohm_in_calibrate_table[CALIBRATE_RES_OHM_IN_POINTS]的数据
eeprom_datasave_single(EEPROM_TAG_CAL_RES_OHM_IN);
//写入0xAAAA标志
eeprom_writedata(CAL_RES_OHM_IN_ADDR_FLAG, 0xAA);
eeprom_writedata(CAL_RES_OHM_IN_ADDR_FLAG + 8, 0xAA);
}
break;
default:
break;
}
cal_flags = CAL_FLAG_NONE;
}
uint8_t pulse = 50;
float32 fre_set_mux = 0;
float32 sv_prv = 0;
CHANNEL ch_prv = CHX_IN_MAX;
uint8_t mux_set_flag = 0;
void mux_signal_switch(st_mux_signal *mux_signal)
{
//只有频道和设定值改变时才执行设定操作(不影响回采和输入采集)
if( (mux_signal->channel == ch_prv)&&(mux_signal->data_sv == sv_prv) )
{
mux_set_flag = 0;
}
else
{
mux_set_flag = 1;
if((mux_signal->channel != ch_prv))
{
//通道改变时切换通道
//HC138_SEL_CH(mux_signal->channel);
mux_channel_switch(mux_signal->channel);
ch_prv = mux_signal->channel;
}
if(mux_signal->data_sv != sv_prv) sv_prv = mux_signal->data_sv;
}
//执行通道对应的功能
switch (mux_signal->channel)
{
case CH0_OUT_VOL_V:
{
if(mux_set_flag) dac_set_voltage(&mux_signal->data_sv); //设定
fun_proc_adc1_dma(&mux_signal->data_pv); //回采
}
break;
case CH1_OUT_VOL_MV:
{
if(mux_set_flag) dac8552_operation(NULL, &mux_signal->data_sv); //设定
fun_get_sig16132_ch(MUX_CHANNEL_MV_FEEDBACK, &mux_signal->data_pv); //回采
}
break;
case CH2_OUT_CUR:
{
if(mux_set_flag) dac8552_operation(&mux_signal->data_sv, NULL); //设定
fun_get_sig16132_ch(MUX_CHANNEL_MA_FEEDBACK, &mux_signal->data_pv); //回采
}
break;
case CH3_OUT_FRE:
{
if( (tabdata.hart_enable == 0)&&(mux_set_flag) )
{
frequence_output(mux_signal->data_sv, pulse, PWM_MUX); //设定
fre_set_mux = mux_signal->data_sv;
}
}
break;
case CH4_OUT_RES:
if(mux_set_flag) fun_dac7811_operate(&mux_signal->data_sv); //设定
break;
case CH5_EMPTY:
break;
case CH6_IN_VOL:
fun_get_sig16132_ch(MUX_CHANNEL_V_IN, &mux_signal->data_pv); //输入采集
break;
case CH7_IN_MVOL:
fun_get_sig16132_ch(MUX_CHANNEL_MV_IN, &mux_signal->data_pv); //输入采集
break;
case CH8_IN_CUR:
fun_get_sig16132_ch(MUX_CHANNEL_MA_IN, &mux_signal->data_pv); //输入采集
break;
case CH9_IN_FRE:
fun_get_freq(&freq_signal, &mux_signal->data_pv); //输入采集
break;
case CH10_IN_RTD:
fun_get_sig16132_ch(CH10_IN_RTD, &mux_signal->data_pv); //输入采集
break;
case CH11_IN_TC:
ads1220_operation(CH11_IN_TC, &mux_signal->data_pv); //输入采集
break;
default:
break;
}
}
void frequence_output(uint32_t freq, uint8_t pulse, uint8_t pwm_select)
{
int fre_duty = 0;
switch (pwm_select)
{
case PWM_MUX:
{
HAL_TIMEx_PWMN_Stop(&htim8, TIM_CHANNEL_2);
if (freq <= 0 || freq >= 500000 || pulse <= 0 || pulse >= 100)
{
__HAL_TIM_SET_PRESCALER(&htim8, 1500-1);
__HAL_TIM_SET_AUTORELOAD(&htim8, 55-1);
__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_2, 28-1);
return;
}
if(freq <= 650)
{
__HAL_TIM_SET_PRESCALER(&htim8, 1500-1);
fre_duty = ( (float32)FREQ_SYS / (float32)1500.0 / (float32)freq + (float32)0.5 );
}
else
{
__HAL_TIM_SET_PRESCALER(&htim8, 2-1);
fre_duty = ( (float32)FREQ_SYS / (float32)2.0 / (float32)freq + (float32)0.5 );
}
__HAL_TIM_SET_AUTORELOAD(&htim8, fre_duty -1);
__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_2, fre_duty * pulse / 100 - 1);
HAL_TIMEx_PWMN_Start(&htim8, TIM_CHANNEL_2);
}
break;
case PWM_HART:
{
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_3);
if (freq <= 0 || freq >= 500000 || pulse <= 0 || pulse >= 100)
{
__HAL_TIM_SET_PRESCALER(&htim1, 1500-1);
__HAL_TIM_SET_AUTORELOAD(&htim1, 55-1);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 28-1);
return;
}
if(freq <= 650)
{
__HAL_TIM_SET_PRESCALER(&htim1, 1500-1);
fre_duty = ( (float32)FREQ_SYS / (float32)1500.0 / (float32)freq + (float32)0.5 );
}
else
{
__HAL_TIM_SET_PRESCALER(&htim1, 2-1);
fre_duty = ( (float32)FREQ_SYS / (float32)2.0 / (float32)freq + (float32)0.5 );
}
__HAL_TIM_SET_AUTORELOAD(&htim1, fre_duty -1);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, fre_duty * pulse / 100 - 1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
}
break;
default:
break;
}
}
void mux_channel_switch(CHANNEL cha)
{
switch (cha)
{
case CH0_OUT_VOL_V:
{
//高电平使能拉低指定通道低电平关闭8路通道全部拉高
HC138_G1_SET(GPIO_PIN_SET);
//SW0, 000
HC138_A2_SET(GPIO_PIN_RESET);
HC138_A1_SET(GPIO_PIN_RESET);
HC138_A0_SET(GPIO_PIN_RESET);
}
break;
case CH1_OUT_VOL_MV:
{
//高电平使能拉低指定通道低电平关闭8路通道全部拉高
HC138_G1_SET(GPIO_PIN_SET);
//SW1, 001
HC138_A2_SET(GPIO_PIN_RESET);
HC138_A1_SET(GPIO_PIN_RESET);
HC138_A0_SET(GPIO_PIN_SET);
}
break;
case CH2_OUT_CUR:
{
//高电平使能拉低指定通道低电平关闭8路通道全部拉高
HC138_G1_SET(GPIO_PIN_SET);
//SW2, 010
HC138_A2_SET(GPIO_PIN_RESET);
HC138_A1_SET(GPIO_PIN_SET);
HC138_A0_SET(GPIO_PIN_RESET);
}
break;
case CH3_OUT_FRE:
{
//高电平使能拉低指定通道低电平关闭8路通道全部拉高
HC138_G1_SET(GPIO_PIN_SET);
//SW3, 011
HC138_A2_SET(GPIO_PIN_RESET);
HC138_A1_SET(GPIO_PIN_SET);
HC138_A0_SET(GPIO_PIN_SET);
}
break;
case CH4_OUT_RES:
{
//关闭HC138
HC138_G1_SET(GPIO_PIN_RESET);
//关闭 RELAY_2 和 RELAY_3
RELAY_2_SET(GPIO_PIN_SET);
RELAY_3_SET(GPIO_PIN_SET);
//打开RELAY_1
RELAY_1_SET(GPIO_PIN_RESET);
}
break;
case CH5_EMPTY:
{}
break;
case CH6_IN_VOL:
{
//高电平使能拉低指定通道低电平关闭8路通道全部拉高
HC138_G1_SET(GPIO_PIN_SET);
//SW4, 100
HC138_A2_SET(GPIO_PIN_SET);
HC138_A1_SET(GPIO_PIN_RESET);
HC138_A0_SET(GPIO_PIN_RESET);
}
break;
case CH7_IN_MVOL:
{
//高电平使能拉低指定通道低电平关闭8路通道全部拉高
HC138_G1_SET(GPIO_PIN_SET);
//SW5, 101
HC138_A2_SET(GPIO_PIN_SET);
HC138_A1_SET(GPIO_PIN_RESET);
HC138_A0_SET(GPIO_PIN_SET);
}
break;
case CH8_IN_CUR:
{
//高电平使能拉低指定通道低电平关闭8路通道全部拉高
HC138_G1_SET(GPIO_PIN_SET);
//SW6, 110
HC138_A2_SET(GPIO_PIN_SET);
HC138_A1_SET(GPIO_PIN_SET);
HC138_A0_SET(GPIO_PIN_RESET);
}
break;
case CH9_IN_FRE:
{
//高电平使能拉低指定通道低电平关闭8路通道全部拉高
HC138_G1_SET(GPIO_PIN_SET);
//SW7, 111
HC138_A2_SET(GPIO_PIN_SET);
HC138_A1_SET(GPIO_PIN_SET);
HC138_A0_SET(GPIO_PIN_SET);
}
break;
case CH10_IN_RTD:
{
//关闭HC138
HC138_G1_SET(GPIO_PIN_RESET);
//关闭 RELAY_1 和 RELAY_3
RELAY_1_SET(GPIO_PIN_SET);
RELAY_3_SET(GPIO_PIN_SET);
//打开RELAY_2
RELAY_2_SET(GPIO_PIN_RESET);
}
break;
case CH11_IN_TC:
{
//关闭HC138
HC138_G1_SET(GPIO_PIN_RESET);
//关闭 RELAY_1 和 RELAY_2
RELAY_1_SET(GPIO_PIN_SET);
RELAY_2_SET(GPIO_PIN_SET);
//打开RELAY_1
RELAY_3_SET(GPIO_PIN_RESET);
}
break;
default:
break;
}
}