Переглянути джерело

Проверка усилителя.

TelenkovDmitry 6 місяців тому
батько
коміт
a8c2f2ade8

+ 81 - 76
fw/modules/io/analog_input.c

@@ -12,7 +12,7 @@
 #include <stdio.h>
 
 #undef DBG
-#define DBG if(1)
+#define DBG if(0)
 
 #if defined (MAI_12)  
 
@@ -40,8 +40,9 @@ ANALOG_IN_t channel_name[NUMBER_ADC_CH] = {AN_INP_1, AN_INP_2, AN_INP_3,
 #endif
 
 
-uint16_t adc_raw_data[AI_ALL_NUMBER];
+uint16_t adc_com_raw_data[AI_COMMON_NUMBER];
 
+uint16_t adc_add_raw_data[AI_ADD_NUMBER];
 
 led_t ai_alarm_led[12] = {IO_1_R, IO_2_R, IO_3_R, IO_4_R, 
                           IO_5_R, IO_6_R, IO_7_R, IO_8_R, 
@@ -81,19 +82,9 @@ void ai_init(void)
 //
 void ai_init_modbus_params(void)
 {
-    for (uint8_t i = 0; i < AI_COMMON_NUMBER/2; i++)
-    {
+    for (uint8_t i = 0; i < AI_COMMON_NUMBER; i++) {
         ai_gain[i] = settings.ai[i].gain_factor;
-        ai_gain[i + 6] = settings.ai[i + 8].gain_factor;
     }
-
-#if 0
-    // для теста
-    for (uint8_t i = 0; i < AI_COMMON_NUMBER; i++)
-    {
-        ai_gain[i] = i + 10;
-    }
-#endif    
 }   
 
 // Управление LED для 12-и основных входов
@@ -101,31 +92,22 @@ void ai_led_update(void)
 {
     for (int i = 0; i < AI_COMMON_NUMBER; i++) 
     {
-        if (settings.ai[i].state) {
+        if (settings.ai[i].state)
             leds[ai_input_led[i]].state = LED_ON;
-        }
-        else {
+        else
             leds[ai_input_led[i]].state = LED_OFF;
-        }
     }
 }
 
 // Установить режим измерения каналов с 1 по 12.
 void ai_set_meas_mode(void)
 {
-#if 0  
-    for (uint8_t i = 1; i < 13; i++)
-    {
-        if (settings.ai_mode_bits & (1 << (i - 1)))
-            ai_set_mode_word((MEAS_CHAN_MODE_t)1, i);
-        else
-            ai_set_mode_word((MEAS_CHAN_MODE_t)0, i);
-    }
-#endif
     for (int i = 0; i < AI_COMMON_NUMBER; i++)
     {
         if (settings.ai[i].mode)
-            ai_set_mode_word((MEAS_CHAN_MODE_t)1, i);
+            ai_set_mode_word((MEAS_CHAN_MODE_t)1, i + 1);
+        else 
+            ai_set_mode_word((MEAS_CHAN_MODE_t)0, i + 1);
     }
 }   
 
@@ -209,13 +191,23 @@ bool ai_adc_init(void)
 // Оцифровка всех 16-и каналов (входы + дополнительные каналы)
 void ai_processing(void)
 {
-    // все 16 каналов
-    for (uint8_t i = 0; i < 8; i++)
+    // 12 основных каналов 
+    for (uint8_t i = 0; i < AI_COMMON_NUMBER/2; i++)
     {
-        adc_meas_two_channels(settings.ai[i], settings.ai[i + 8], i);
+        adc_meas_two_channels(&settings.ai[i], &settings.ai[i + 6], 
+                              &adc_com_raw_data[i], &adc_com_raw_data[i + 6]);
     }
     
 #if 0    
+    // 4 дополнительных канала
+    for (uint8_t i = 0; i < AI_ADD_NUMBER/2; i++)
+    {
+        adc_meas_two_channels(&settings.ai_add[i], &settings.ai_add[i + 2], 
+                              &adc_add_raw_data[i], &adc_add_raw_data[i + 2]);
+    }
+#endif    
+    
+#if 1    
     printf("end\r\n");
     adc_print_data();
     printf("end\r\n");  
@@ -223,56 +215,84 @@ void ai_processing(void)
 }
 
 //
-void adc_meas_two_channels(ai_t one, ai_t two, uint8_t data_index)
+void adc_meas_two_channels(ai_t *one, ai_t *two, uint16_t *out_one, uint16_t *out_two)
 {
+    uint8_t gain;
+    
     // 1 - ый канал
-    if (one.state == 0) {
-        DBG printf("[one] channel name: %u off, data_index: %u\r\n", one.name, data_index);
+    if (one->state == 0) {
+        DBG printf("[one] channel name: %u off\r\n", one->name);
     }
     else {
-        DBG printf("[one] channel name: %u on, data_index: %u\r\n", one.name, data_index);
+        DBG printf("[one] channel name: %u on\r\n", one->name);
         
-        ai_connect_channel(one.name);
+        gain = adc_get_gain(one->gain_factor);
+        MS5192T_SetGain(gain);
+        ai_connect_channel(one->name);
         vTaskDelay(1);
         MS5192T_SetChannel(MS5192T_CH_AIN1P_AIN1M);
-        adc_raw_data[data_index] = MS5192T_SingleConversion();
+        *out_one = MS5192T_SingleConversion();
     }            
         
     // 2 - ой канал
-    if (two.state == 0) {
-        DBG printf("[two] channel name: %u off, data_index: %u\r\n", two.name, data_index + 8);
+    if (two->state == 0) {
+        DBG printf("[two] channel name: %u off\r\n", two->name);
     }
     else {
-        DBG printf("[two] channel name: %u on, data_index: %u\r\n", two.name, data_index + 8);
+        DBG printf("[two] channel name: %u on\r\n", two->name);
         
-        ai_connect_channel(two.name);
+        gain = adc_get_gain(two->gain_factor);
+        MS5192T_SetGain(gain);
+        ai_connect_channel(two->name);
         vTaskDelay(1);
         MS5192T_SetChannel(MS5192T_CH_AIN2P_AIN2M);
-        adc_raw_data[data_index + 8] = MS5192T_SingleConversion();
+        *out_two = MS5192T_SingleConversion();
     }
 }
 
+//
+uint8_t adc_get_gain(uint8_t tmp) 
+{
+    uint8_t ret;
+    
+    switch (tmp)
+    {
+        case 1  : ret = MS5192T_GAIN_1;   break;
+        case 2  : ret = MS5192T_GAIN_2;   break;
+        case 4  : ret = MS5192T_GAIN_4;   break;
+        case 8  : ret = MS5192T_GAIN_8;   break;
+        case 16 : ret = MS5192T_GAIN_16;  break;
+        case 32 : ret = MS5192T_GAIN_32;  break;
+        case 64 : ret = MS5192T_GAIN_64;  break;
+        case 128: ret = MS5192T_GAIN_128; break;
+        default : ret = MS5192T_GAIN_1;   break;
+    }
+    return ret;
+}
+
 //
 void adc_print_data(void)
 {
-    printf("\033[2J"); // Очистить
-    printf("\033[H");  // Переместить курсор в левый верхний угол
-    printf("AN_INP_1: 0x%X, %f\r\n", adc_raw_data[0],  (double) adc_raw_data[0]*0.00001785305/0.0961538);
-    printf("AN_INP_2: 0x%X, %f\r\n", adc_raw_data[1],  (double) adc_raw_data[1]*0.00001785305/0.0961538);
-    printf("AN_INP_3: 0x%X, %f\r\n", adc_raw_data[2],  (double) adc_raw_data[2]*0.00001785305/0.0961538);
-    printf("AN_INP_4: 0x%X, %f\r\n", adc_raw_data[3],  (double) adc_raw_data[3]*0.00001785305/0.0961538);
-    printf("AN_INP_5: 0x%X, %f\r\n", adc_raw_data[4],  (double) adc_raw_data[4]*0.00001785305/0.0961538);
-    printf("AN_INP_6: 0x%X, %f\r\n", adc_raw_data[5],  (double) adc_raw_data[5]*0.00001785305/0.0961538);
-    printf("AN_INP_7: 0x%X, %f\r\n", adc_raw_data[6],  (double) adc_raw_data[6]*0.00001785305/0.0961538);
-    printf("AN_INP_8: 0x%X, %f\r\n", adc_raw_data[7],  (double) adc_raw_data[7]*0.00001785305/0.0961538);
-    printf("AN_INP_9: 0x%X, %f\r\n", adc_raw_data[8],  (double) adc_raw_data[8]*0.00001785305/0.0961538);
-    printf("AN_INP_10: 0x%X, %f\r\n", adc_raw_data[9], (double) adc_raw_data[9]*0.00001785305/0.0961538);
-    printf("AN_INP_11: 0x%X, %f\r\n", adc_raw_data[10],(double) adc_raw_data[10]*0.00001785305/0.0961538);
-    printf("AN_INP_12: 0x%X, %f\r\n", adc_raw_data[11],(double) adc_raw_data[11]*0.00001785305/0.0961538);
-    printf("V_ISO_CL: 0x%X, %f\r\n", adc_raw_data[12], (double) adc_raw_data[12]*0.00001785305/0.0961538);
-    printf("V_ISO: 0x%X, %f\r\n", adc_raw_data[13],    (double) adc_raw_data[13]*0.00001785305/0.0961538);
-    printf("CRNT_LIM_U_BFR_R: 0x%X, %f\r\n", adc_raw_data[14], (double) adc_raw_data[14]*0.00001785305/0.0961538);
-    printf("CRNT_LIM_U_ABFR_R: 0x%X, %f\r\n", adc_raw_data[15], (double) adc_raw_data[15]*0.00001785305/0.0961538);
+    printf("\033[2J"); 
+    printf("\033[H");  
+    
+    printf("AN_INP_1: 0x%X, %f\r\n", adc_com_raw_data[0], (double)adc_com_raw_data[0]*0.00001785305/0.0961538);
+    printf("AN_INP_2: 0x%X, %f\r\n", adc_com_raw_data[1], (double)adc_com_raw_data[1]*0.00001785305/0.0961538);
+    printf("AN_INP_3: 0x%X, %f\r\n", adc_com_raw_data[2], (double)adc_com_raw_data[2]*0.00001785305/0.0961538);
+    printf("AN_INP_4: 0x%X, %f\r\n", adc_com_raw_data[3], (double)adc_com_raw_data[3]*0.00001785305/0.0961538);
+    printf("AN_INP_5: 0x%X, %f\r\n", adc_com_raw_data[4], (double)adc_com_raw_data[4]*0.00001785305/0.0961538);
+    printf("AN_INP_6: 0x%X, %f\r\n", adc_com_raw_data[5], (double)adc_com_raw_data[5]*0.00001785305/0.0961538);
+    printf("AN_INP_7: 0x%X, %f\r\n", adc_com_raw_data[6], (double)adc_com_raw_data[6]*0.00001785305/0.0961538);
+    printf("AN_INP_8: 0x%X, %f\r\n", adc_com_raw_data[7], (double)adc_com_raw_data[7]*0.00001785305/0.0961538);
+    printf("AN_INP_9: 0x%X, %f\r\n", adc_com_raw_data[8], (double)adc_com_raw_data[8]*0.00001785305/0.0961538);
+    printf("AN_INP_10: 0x%X, %f\r\n",adc_com_raw_data[9], (double)adc_com_raw_data[9]*0.00001785305/0.0961538);
+    printf("AN_INP_11: 0x%X, %f\r\n",adc_com_raw_data[10],(double)adc_com_raw_data[10]*0.00001785305/0.0961538);
+    printf("AN_INP_12: 0x%X, %f\r\n",adc_com_raw_data[11],(double)adc_com_raw_data[11]*0.00001785305/0.0961538);
+    
+    printf("V_ISO_CL: 0x%X, %f\r\n", adc_add_raw_data[0], (double)adc_add_raw_data[0]*0.00001785305/0.0961538);
+    printf("V_ISO: 0x%X, %f\r\n",    adc_add_raw_data[1], (double)adc_add_raw_data[1]*0.00001785305/0.0961538);
+    printf("CRNT_LIM_U_BFR_R: 0x%X, %f\r\n", adc_add_raw_data[2],(double)adc_add_raw_data[2]*0.00001785305/0.0961538);
+    printf("CRNT_LIM_U_ABFR_R: 0x%X, %f\r\n",adc_add_raw_data[3],(double)adc_add_raw_data[3]*0.00001785305/0.0961538);
 }
 
 // 
@@ -282,11 +302,11 @@ void adc_task(void *params)
     {
         ai_alarm = sh_ai_mode(ai_mode);
         
-        //ai_processing();
+        ai_processing();
         
         ai_leds_processing();
         
-        //vTaskDelay(10);
+        vTaskDelay(10);
     }
 }
 
@@ -354,7 +374,6 @@ void ai_set(void)
             else {
                 leds[ai_input_led[i]].state = LED_ON;
             }
-                
         }
     }
 }
@@ -384,7 +403,6 @@ void ai_set_mode(MEAS_CHAN_MODE_t mode, uint8_t channel)
 // Формируем слово режима работы каналов (ai_mode)
 void ai_set_mode_word(MEAS_CHAN_MODE_t mode, uint8_t channel)
 {
-#if 0  
     if (mode == MEAS_CURRENT) 
     {
         if (channel < 7)
@@ -397,19 +415,6 @@ void ai_set_mode_word(MEAS_CHAN_MODE_t mode, uint8_t channel)
             ai_mode &= ~(1 << (channel - 1));
         else
             ai_mode &= ~(1 << (channel + 1));
-#endif
-    if (mode == MEAS_CURRENT) 
-    {
-        if (channel < 7)
-            ai_mode |= (1 << channel);
-        else
-            ai_mode |= (1 << channel);
-    }
-    else
-        if (channel < 7)
-            ai_mode &= ~(1 << channel);
-        else
-            ai_mode &= ~(1 << channel);
 }
 
 // Сигнал питания внешних датчиков

+ 4 - 1
fw/modules/io/analog_input.h

@@ -71,7 +71,10 @@ bool ai_adc_init(void);
 void ai_processing(void);
 
 //
-void adc_meas_two_channels(ai_t one, ai_t two, uint8_t data_index);
+void adc_meas_two_channels(ai_t *one, ai_t *two, uint16_t *out_one, uint16_t *out_two);
+
+//
+uint8_t adc_get_gain(uint8_t tmp);
 
 //
 void adc_print_data(void);

+ 3 - 1
fw/modules/io/io.h

@@ -26,7 +26,9 @@
 
 #define AI_ALL_NUMBER       16  // Общее количество
 
-#define AI_COMMON_NUMBER    12 // Основные 12
+#define AI_COMMON_NUMBER    12  // Основные 12
+
+#define AI_ADD_NUMBER       4   // Дополнительные 4 входа
 
 // -------------------------------------------------------------------------- //
 

+ 2 - 3
fw/modules/modbus/modbus_ai_params.c

@@ -41,7 +41,7 @@ uint16_t mb_init_ai_params(uint16_t i)
         mb_param[index].reg = addr;
         mb_param[index].size = 1;
         mb_param[index].param = (uint8_t*)&ai_gain[i];
-        mb_param[index].set = NULL;
+        mb_param[index].set = mb_set_ai_gain;
         mb_param[index].get = NULL;
         mb_param[index].check_handler = mb_check_dummy;
         
@@ -239,10 +239,9 @@ mb_delay_action_t mb_set_ai_mode(void)
 //
 mb_delay_action_t mb_set_ai_gain(void)
 {
-    for (uint8_t i = 0; i < AI_COMMON_NUMBER/2; i++)
+    for (uint8_t i = 0; i < AI_COMMON_NUMBER; i++)
     {
         settings.ai[i].gain_factor = ai_gain[i];
-        settings.ai[i + 8].gain_factor = ai_gain[i + 6];
     }  
     return MB_NO_ACTION;
 }

+ 3 - 0
fw/modules/modbus/modbus_ai_params.h

@@ -27,6 +27,9 @@ mb_delay_action_t mb_set_ai_state(void);
 //
 mb_delay_action_t mb_set_ai_mode(void);
 
+//
+mb_delay_action_t mb_set_ai_gain(void);
+
 //
 mb_delay_action_t mb_set_ext_sens_power(void);
 

+ 20 - 17
fw/modules/settings/settings_ai.c

@@ -24,7 +24,8 @@ void settings_ai_def(settings_t *settings)
     // Режим измерения напряжения
     settings->ai_mode_bits = 0;
     
-    for (int i = 0; i < AI_ALL_NUMBER; i++) 
+    // Основные 12 каналов
+    for (int i = 0; i < AI_COMMON_NUMBER; i++) 
     {  
         settings->ai[i].state = 0;  // вход выключен
         settings->ai[i].mode = 0;   // режим измерения напряжения
@@ -37,23 +38,25 @@ void settings_ai_def(settings_t *settings)
     settings->ai[3].name = AN_INP_4;
     settings->ai[4].name = AN_INP_5;
     settings->ai[5].name = AN_INP_6;
-    settings->ai[6].name = V_ISO_CL;
-    settings->ai[7].name = V_ISO;
-    
-    settings->ai[8].name = AN_INP_7;
-    settings->ai[9].name = AN_INP_8;
-    settings->ai[10].name = AN_INP_9;
-    settings->ai[11].name = AN_INP_10;
-    settings->ai[12].name = AN_INP_11;
-    settings->ai[13].name = AN_INP_12;
-    settings->ai[14].name = CRNT_LIM_U_BFR_R;
-    settings->ai[15].name = CRNT_LIM_U_ABFR_R;
+    settings->ai[6].name = AN_INP_7;
+    settings->ai[7].name = AN_INP_8;
+    settings->ai[8].name = AN_INP_9;
+    settings->ai[9].name = AN_INP_10;
+    settings->ai[10].name = AN_INP_11;
+    settings->ai[11].name = AN_INP_12;
+
+    // Дополнительные 4 канала. Измерения происходят всегда.
+    for (int i = 0; i < AI_ADD_NUMBER; i++) 
+    {  
+        settings->ai_add[i].state = 1;  // вход включен
+        settings->ai_add[i].mode = 0;   // режим измерения напряжения
+        settings->ai_add[i].gain_factor = 1; // коэф-т усиления внешнего ADC
+    }
     
-    // Дополнительные каналы работают всегда (режим измерения напряжения).
-    settings->ai[6].state = 1;
-    settings->ai[7].state = 1;
-    settings->ai[14].state = 1;
-    settings->ai[15].state = 1;
+    settings->ai_add[0].name = V_ISO_CL;
+    settings->ai_add[1].name = V_ISO;
+    settings->ai_add[2].name = CRNT_LIM_U_BFR_R;
+    settings->ai_add[3].name = CRNT_LIM_U_ABFR_R;
 }
 
 //

+ 3 - 1
fw/modules/settings/settings_api.h

@@ -119,7 +119,9 @@ typedef struct
 #endif
 
 #if defined (MAI_12)
-    ai_t        ai[AI_ALL_NUMBER];  // 
+    ai_t        ai[AI_COMMON_NUMBER];   // 
+    ai_t        ai_add[AI_ADD_NUMBER];  //
+     
     uint16_t    ai_state_bits;      // статус входа (для 12 основных), 0 - выкл, 1 - вкл
     uint16_t    ai_mode_bits;       // режим работы входов (для 12 основных), 0 - измерение напряжения, 1 - тока
     uint16_t    ext_sens_power;     // питание внешних датчиков, 0 - выкл, 1 - вкл

+ 1 - 1
fw/user/main.cpp

@@ -280,7 +280,7 @@ void init_task(void *argument)
     // Тесты GPIO
     //xTaskCreate(test_gpio, "gpio_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
     
-    ai_processing();
+    //ai_processing();
     
 // -------------------------------------------------------------------------- //
 // Удаляем стартовую задачу 


Різницю між файлами не показано, бо вона завелика
+ 393 - 398
project/ewarm/iap/iap.dep


Різницю між файлами не показано, бо вона завелика
+ 681 - 683
project/ewarm/module_universal_io.dep


BIN
tools/__pycache__/digital_io.cpython-312.pyc


+ 29 - 4
tools/analog_in.py

@@ -138,17 +138,42 @@ def main():
     # ai.print_inputs()
 
     '''Установка коэффициентов усиления. Тесты'''
+    '''
     for i in range(1, 13):
-        ai.set_input_gain(i, i+21)
+        ai.set_input_gain(i, i + 20)
+    '''
 
+    ai.set_input_gain(1, 8)
 
     # for i in range(1000):
     #     ai.print_inputs()
     #     sleep(1)
 
-    # print(ai.get_inputs_state())
-    # ai.set_inputs_state(0b1000_1010_1010)
-    # print(ai.get_inputs_state())
+    '''Последовательное включение входов по одному.'''
+    '''
+    while True:
+        for i in range(12):
+            ai.set_inputs_state(1 << i)        
+            print(ai.get_inputs_state())
+            sleep(1)
+    '''            
+    '''Настройка режима измерения'''
+    '''
+    while True:
+        for i in range(12):
+            ai.set_inputs_mode(1 << i)
+            print(ai.get_inputs_mode())
+            sleep(1)
+    '''
+            
+
+    
+    print(ai.get_inputs_state())
+    ai.set_inputs_state(0b0000_0000_1111)
+    # ai.set_inputs_state(0b0001_1000_0000)
+    # ai.set_inputs_state(0b1111_1111_1111)
+    print(ai.get_inputs_state())
+    
     # sleep(1)
     # ai.set_inputs_state(0b0)
 

+ 7 - 1
tools/tester.py

@@ -11,5 +11,11 @@ class Tester:
 def main():
     print(time.time())
 
+    for i in range(12):
+        data = format(1 << i, '16b')
+        print(data)
+
 if __name__ == '__main__':
-    main()
+    main()
+    
+    1000_0000_0000

Деякі файли не було показано, через те що забагато файлів було змінено