From e86661c0b542259c60ce67f1eaf927509efae390 Mon Sep 17 00:00:00 2001 From: AlexeiBazlaev Date: Wed, 27 Jan 2021 21:35:04 +0700 Subject: [PATCH] Added backlight --- .vs/TE_Controller/v14/.atsuo | Bin 79872 -> 92672 bytes TE_Controller/TE_Controller.cproj | 12 + TE_Controller/src/config/FreeRTOSConfig.h | 2 +- TE_Controller/src/include/adc_user.h | 1 + TE_Controller/src/include/mcu_control.h | 3 +- TE_Controller/src/include/power_regulator.h | 20 + TE_Controller/src/include/tcc_user.h | 17 + TE_Controller/src/main.c | 387 ++++++++++++------ TE_Controller/src/main.h | 18 +- TE_Controller/src/source/adc_user.c | 11 +- TE_Controller/src/source/backlight.c | 19 +- TE_Controller/src/source/dht.c | 6 +- .../src/source/light_ws2812_cortex.c | 1 - TE_Controller/src/source/mcu_control.c | 11 +- TE_Controller/src/source/power_regulator.c | 43 ++ TE_Controller/src/source/tcc_user.c | 78 ++++ TE_Controller/src/source/tec.c | 31 +- 17 files changed, 490 insertions(+), 170 deletions(-) create mode 100644 TE_Controller/src/include/power_regulator.h create mode 100644 TE_Controller/src/include/tcc_user.h create mode 100644 TE_Controller/src/source/power_regulator.c create mode 100644 TE_Controller/src/source/tcc_user.c diff --git a/.vs/TE_Controller/v14/.atsuo b/.vs/TE_Controller/v14/.atsuo index 0b9b262ee06c9ad4edcc911f0c76f70e9b81b2ab..a75a1e95332d7bf0443c42c952d576b0ca5ba6df 100644 GIT binary patch delta 10651 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 MyPfD3Y_X>Q6 compile + + compile + compile + + compile + compile @@ -1811,9 +1817,15 @@ compile + + compile + compile + + compile + compile diff --git a/TE_Controller/src/config/FreeRTOSConfig.h b/TE_Controller/src/config/FreeRTOSConfig.h index c88e882..a881def 100644 --- a/TE_Controller/src/config/FreeRTOSConfig.h +++ b/TE_Controller/src/config/FreeRTOSConfig.h @@ -56,7 +56,7 @@ #define configCPU_CLOCK_HZ ( 48000000) #define configTICK_RATE_HZ ( 1000 ) #define configMAX_PRIORITIES ( 5 ) -#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 130 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 64 ) #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 4 * 1024 ) ) #define configMAX_TASK_NAME_LEN ( 24 ) #define configUSE_TRACE_FACILITY 1 diff --git a/TE_Controller/src/include/adc_user.h b/TE_Controller/src/include/adc_user.h index 66e2f25..f960163 100644 --- a/TE_Controller/src/include/adc_user.h +++ b/TE_Controller/src/include/adc_user.h @@ -25,4 +25,5 @@ float adc_get_V(uint16_t value); float adc_get_Q(uint16_t value); uint16_t adc_read_value_spec(ADC_chan_t); float adc_get_V_spec(ADC_chan_t chan); + #endif /* ADC_H_ */ \ No newline at end of file diff --git a/TE_Controller/src/include/mcu_control.h b/TE_Controller/src/include/mcu_control.h index b8ebbda..88f7cef 100644 --- a/TE_Controller/src/include/mcu_control.h +++ b/TE_Controller/src/include/mcu_control.h @@ -8,10 +8,11 @@ #ifndef MCU_CONTROL_H_ #define MCU_CONTROL_H_ - +#include "stdint-gcc.h" #define MAX_STR_FLOAT 12 void MCU_control_init(void); void MCU_control(void); +float GetTecCurrent(float currentSenseResistence); #endif /* MCU_CONTROL_H_ */ \ No newline at end of file diff --git a/TE_Controller/src/include/power_regulator.h b/TE_Controller/src/include/power_regulator.h new file mode 100644 index 0000000..21e7398 --- /dev/null +++ b/TE_Controller/src/include/power_regulator.h @@ -0,0 +1,20 @@ +/* + * power_regulator.h + * + * Created: 18.01.2021 22:07:56 + * Author: Lexus + */ + + +#ifndef POWER_REGULATOR_H_ +#define POWER_REGULATOR_H_ +#include "stdbool.h" +#include + + +void temperature_control(float TEC_Temp, float *TEC_Power, bool enable); +//void TEC_power_set(bool value); + + + +#endif /* POWER_REGULATOR_H_ */ \ No newline at end of file diff --git a/TE_Controller/src/include/tcc_user.h b/TE_Controller/src/include/tcc_user.h new file mode 100644 index 0000000..4c45901 --- /dev/null +++ b/TE_Controller/src/include/tcc_user.h @@ -0,0 +1,17 @@ +/* + * tcc.h + * + * Created: 18.01.2021 22:11:39 + * Author: Lexus + */ + + +#ifndef TCC_H_ +#define TCC_H_ +#include "tc.h" +void configure_tcc(void); +void print_tcc_status(void); +void configure_tc(void); +void configure_tc_callbacks(void); +void tc_callback(struct tc_module *const module_inst); +#endif /* TCC_H_ */ \ No newline at end of file diff --git a/TE_Controller/src/main.c b/TE_Controller/src/main.c index 011e26e..676b1e4 100644 --- a/TE_Controller/src/main.c +++ b/TE_Controller/src/main.c @@ -1,24 +1,22 @@ /** * \file * - * \brief CDC Application Main functions + * \brief TE_Controller * - * Copyright (c) 2011-2018 Microchip Technology Inc. and its subsidiaries. - * - * \asf_license_start + * Copyright (c) 2020-2021 Realsence Inc. and its subsidiaries. * * \page License * - * Subject to your compliance with these terms, you may use Microchip - * software and any derivatives exclusively with Microchip products. + * Subject to your compliance with these terms, you may use Realsence + * software and any derivatives exclusively with Realsence products. * It is your responsibility to comply with third party license terms applicable * to your use of third party software (including open source software) that - * may accompany Microchip software. + * may accompany Realsence software. * - * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * THIS SOFTWARE IS SUPPLIED BY Realsence "AS IS". NO WARRANTIES, * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL Realsence BE * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE @@ -26,14 +24,9 @@ * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. - * - * \asf_license_stop - * - */ -/* - * Support and FAQ: visit Microchip Support */ + #include #include "conf_usb.h" #include "ui.h" @@ -43,6 +36,13 @@ #include "realsence.h" #include "ntc.h" #include +#include "dht.h" +#include "mcu_control.h" +#include "adc_user.h" +#include "power_regulator.h" +#include "tec.h" +#include "backlight.h" +#include "ws2812.h" #define PORT_STDIO 0 #define PORT_DATA 1 @@ -50,150 +50,232 @@ uint16_t adc_value = 100; //char rcvBuff[128] = {0}; char str[128] = {0}; -UBaseType_t uxHighWaterMark_cdc_rx_check; -UBaseType_t uxHighWaterMark_led_blink, uxHighWaterMark_mesure; +UBaseType_t uxHighWaterMark_cdc_rx_check, uxHighWaterMark_cdc_tx; +UBaseType_t uxHighWaterMark_led_blink, uxHighWaterMark_mesure, uxHighWaterMark_regulator, uxHighWaterMark_backlight; static volatile bool main_b_cdc_enable = false; struct measured_params m_params; Controller_t Controller; -/*! \brief Main function. Execution starts here. - */ +/************************************************************************ +* \brief Main function. Execution starts here. +************************************************************************/ int main(void) { - irq_initialize_vectors(); - cpu_irq_enable(); - - // Initialize the sleep manager + cpu_irq_enable(); sleepmgr_init(); + system_init(); -#if !SAM0 - sysclk_init(); - board_init(); -#else - system_init(); -#endif - - // Start USB stack to authorize VBus monitoring - InitTask_cdc_rx_check(); - // Init LED + InitTask_cdc_rx_tx(); InitTask_led_blink();//ui_init();//ui_powerdown(); InitTask_measure(); + InitTask_regulator(); + InitTask_backlight(); vTaskStartScheduler(); - while(true){ - __BKPT(); + __BKPT(); +} + + +/************************************************************************ +* \fn void Task_measure(void *parameters) +* \brief +* \param +* \return +************************************************************************/ +void Task_measure(void *parameters) +{ + uxHighWaterMark_mesure = uxTaskGetStackHighWaterMark( NULL ); + for (;;) + { + Controller.temps.MCU_Temp = NTC_MCU_get_temp(NULL); + Controller.temps.TEC_Temp = NTC_TEC_get_temp(NULL, NULL); + //measurement_DHT22(); + Controller.tecState.tecV_N = adc_get_V_spec(chan_LFB); + Controller.tecState.tecV_P = adc_get_V_spec(chan_SFB); + Controller.tecState.tecI = GetTecCurrent(CURRENT_SENSE_RESISTENCE); + + uxHighWaterMark_mesure = uxTaskGetStackHighWaterMark( NULL ); + vTaskDelay(20); } } -void Task_cdc_rx_check(void *parameters) + +/************************************************************************ +* \fn void Task_regulator(void *parameters) +* \brief +* \param +* \return +************************************************************************/ +void Task_regulator(void *parameters) +{ + uxHighWaterMark_regulator = uxTaskGetStackHighWaterMark( NULL ); + for (;;) + { + temperature_control(Controller.temps.MCU_Temp, &m_params.TEC_Power, ENABLE); + uxHighWaterMark_regulator = uxTaskGetStackHighWaterMark( NULL ); + //vTaskDelay(1000); + } +} + + +/************************************************************************ +* \fn void Task_cdc_rx(void *parameters) +* \brief +* \param +* \return +************************************************************************/ +void Task_cdc_rx(void *parameters) { #define PORT0 0 - iram_size_t len = 0; - uxHighWaterMark_cdc_rx_check = uxTaskGetStackHighWaterMark( NULL ); + iram_size_t len = 0; + uxHighWaterMark_cdc_rx_check = uxTaskGetStackHighWaterMark( NULL ); while(true) - { - if(main_b_cdc_enable && - (len = udi_cdc_multi_get_nb_received_data(PORT0)) > 0 && - udi_cdc_read_no_polling(str, (len<=128)?len:128) > 0 ) - { + { + if(main_b_cdc_enable && + (len = udi_cdc_multi_get_nb_received_data(PORT0)) > 0 && + udi_cdc_read_no_polling(str, (len<=128)?len:128) > 0 ) + { str[len]=0; - printf("<%s\n", str); + printf("<%s\n", str); } uxHighWaterMark_cdc_rx_check = uxTaskGetStackHighWaterMark( NULL ); } } -/*void Task_cdc_rx_check(void *parameters) + + +/************************************************************************ +* \fn void Task_cdc_tx(void *parameters) +* \brief +* \param +* \return +************************************************************************/ +void Task_cdc_tx(void *parameters) { #define PORT0 0 - char rcvBuf[128]; - char *pStr = rcvBuf; - int len=0; - uxHighWaterMark_cdc_rx_check = uxTaskGetStackHighWaterMark( NULL ); + uxHighWaterMark_cdc_tx = uxTaskGetStackHighWaterMark( NULL ); while(true) - { - if (main_b_cdc_enable) + { + if (main_b_cdc_enable && udi_cdc_multi_is_tx_ready(PORT0)) { - int symb = udi_cdc_getc(); - if(symb) - { - len += sprintf(pStr++, "%c", symb); - } - if(symb == '\n') - { - udi_cdc_write_buf(rcvBuf, len); - pStr = rcvBuf; - len = 0; - } - } - uxHighWaterMark_cdc_rx_check = uxTaskGetStackHighWaterMark( NULL ); + if(fpclassify(Controller.temps.MCU_Temp) == FP_NAN) + printf(">NTC_MCU_TEMP = NAN\n\r"); + else + printf(">NTC_MCU_TEMP = %d\n\r", (int)Controller.temps.MCU_Temp);//printf(">NTC_MCU_TEMP = %d, NTC_TEC_TEMP = %d\n\r", (int)Controller.temps.MCU_Temp, (int)Controller.temps.TEC_Temp); + } + LED_Toggle(LED_PIN); + vTaskDelay(1000); + uxHighWaterMark_cdc_tx = uxTaskGetStackHighWaterMark( NULL ); } -}*/ -void InitTask_cdc_rx_check(void) +} + +/************************************************************************ +* \fn void Task_led_blink(void *parameters) +* \brief +* \param +* \return +************************************************************************/ +void Task_backlight(void *parameters) +{ uint32_t cnt10 = 0; + uxHighWaterMark_backlight = uxTaskGetStackHighWaterMark( NULL ); + while(1) + { + backlight_color_show(255, 0, 0); + vTaskDelay(1000); + backlight_color_show(255, 100, 0); + vTaskDelay(1000); + backlight_color_show(0, 255, 0); + vTaskDelay(1000); + /*backlight_event_100ms(); + vTaskDelay(100); + if(!((++cnt10)%10)) + backlight_event_1s();*/ + uxHighWaterMark_backlight = uxTaskGetStackHighWaterMark( NULL ); + } +} + +/************************************************************************ +* \fn void InitTask_cdc_rx_tx(void) +* \brief +* \param +* \return +************************************************************************/ +void InitTask_cdc_rx_tx(void) { // Enable USB Stack Device stdio_usb_init();//udc_start(); stdio_usb_enable(); - xTaskCreate(Task_cdc_rx_check, (const char*)"Task_cdc_rx_check", configMINIMAL_STACK_SIZE*3, NULL,configMAX_PRIORITIES-1, NULL); + xTaskCreate(Task_cdc_rx, (const char*)"Task_cdc_rx", configMINIMAL_STACK_SIZE*1, NULL,configMAX_PRIORITIES-1, NULL); + xTaskCreate(Task_cdc_tx, (const char*)"Task_cdc_tx", configMINIMAL_STACK_SIZE*3, NULL,configMAX_PRIORITIES-1, NULL); } -void Task_led_blink(void *parameters) +/************************************************************************ +* \fn void InitTask_regulator(void) +* \brief +* \param +* \return +************************************************************************/ +void InitTask_regulator(void) { - //long int c1=0; - //long int c2=0; - int cnt=0; - /* Inspect our own high water mark on entering the task. */ + xTaskCreate(Task_regulator, (const char*)"Task_regulator", configMINIMAL_STACK_SIZE*3, NULL,configMAX_PRIORITIES-1, NULL); +} + +/************************************************************************ +* \fn void InitTask_measure(void) +* \brief +* \param +* \return +************************************************************************/ +void InitTask_measure(void) +{ + configure_adc(); + xTaskCreate(Task_measure, (const char*)"Task_measure", configMINIMAL_STACK_SIZE*2, NULL,configMAX_PRIORITIES-1, NULL); +} + +/************************************************************************ +* \fn void InitTask_backlight(void) +* \brief +* \param +* \return +************************************************************************/ +void InitTask_backlight(void) +{ + ws2812_configure_port_pins(); + backlight_init(); + backlight_mode_demo(); + xTaskCreate(Task_backlight, (const char*)"Task_backlight", configMINIMAL_STACK_SIZE*1, NULL,configMAX_PRIORITIES-1, NULL); +} + + + +/************************************************************************ +* \fn void Task_led_blink(void *parameters) +* \brief +* \param +* \return +************************************************************************/ +void Task_led_blink(void *parameters) +{ + int cnt=0; uxHighWaterMark_led_blink = uxTaskGetStackHighWaterMark( NULL ); while(1) { if (main_b_cdc_enable && udi_cdc_multi_is_tx_ready(PORT0)) printf(">%u sec\n\r", (cnt++));//// stdio_usb_putchar (NULL, "data");// vTaskDelay(1000); - LED_Toggle(LED_PIN); - /*if((c1 % 50000) == 0){ - //periodic_event_1s(); - if(!stdio_cdc_opened){ - if(c2 % 2){ - set_led(false); - }else{ - set_led(true); - } - }else{ - if(c2 % 3){ - set_led(false); - }else{ - set_led(true); - } - } - c2++; - } - c1++;*/ + LED_Toggle(LED_PIN); uxHighWaterMark_led_blink = uxTaskGetStackHighWaterMark( NULL ); } } -void Task_measure(void *parameters) -{ - uxHighWaterMark_mesure = uxTaskGetStackHighWaterMark( NULL ); - for (;;) - { - Controller.temps.MCU_Temp = NTC_MCU_get_temp(NULL); - Controller.temps.TEC_Temp = NTC_TEC_get_temp(NULL, NULL); - if (main_b_cdc_enable && udi_cdc_multi_is_tx_ready(PORT0)) - { - if(fpclassify(Controller.temps.MCU_Temp) == FP_NAN) - printf(">NTC_MCU_TEMP = NAN\n\r"); - else - printf(">NTC_MCU_TEMP = %d\n\r", (int)Controller.temps.MCU_Temp);//printf(">NTC_MCU_TEMP = %d, NTC_TEC_TEMP = %d\n\r", (int)Controller.temps.MCU_Temp, (int)Controller.temps.TEC_Temp); - } - LED_Toggle(LED_PIN); - uxHighWaterMark_mesure = uxTaskGetStackHighWaterMark( NULL ); - vTaskDelay(1000); - } -} - +/************************************************************************ +* \fn void Task_led_blink(void *parameters) +* \brief +* \param +* \return +************************************************************************/ void InitTask_led_blink(void) { led_configure_port_pins(); @@ -201,11 +283,7 @@ void InitTask_led_blink(void) //xTaskCreate(Task_led_blink, (const char*)"Task_led_blink", configMINIMAL_STACK_SIZE*2, NULL,configMAX_PRIORITIES-1, NULL); } -void InitTask_measure(void) -{ - configure_adc(); - xTaskCreate(Task_measure, (const char*)"Task_measure", configMINIMAL_STACK_SIZE*2, NULL,configMAX_PRIORITIES-1, NULL); -} + void main_suspend_action(void) @@ -257,16 +335,7 @@ void main_cdc_disable(uint8_t port) uart_close(port); } -/*void main_cdc_set_dtr(uint8_t port, bool b_enable) -{ - if (b_enable) { - // Host terminal has open COM - ui_com_open(port); - }else{ - // Host terminal has close COM - ui_com_close(port); - } -}*/ + void main_cdc_set_dtr(uint8_t port, bool b_enable) { if(port == PORT_STDIO){ @@ -292,21 +361,42 @@ void led_configure_port_pins(void) port_pin_set_config(LED_PIN, &config_port_pin); } -void vApplicationMallocFailedHook (void) { +/************************************************************************ +* \fn void vApplicationMallocFailedHook (void) +* \brief +* \param +* \return +************************************************************************/ +void vApplicationMallocFailedHook (void) +{ while (1) { __BKPT(); }; } -void vApplicationStackOverflowHook (void) { +/************************************************************************ +* \fn void vApplicationStackOverflowHook (void) +* \brief +* \param +* \return +************************************************************************/ +void vApplicationStackOverflowHook (void) +{ while (1) { __BKPT(); }; } -void prvGetRegistersFromStack (uint32_t *pulFaultStackAddress) { +/************************************************************************ +* \fn void prvGetRegistersFromStack (uint32_t *pulFaultStackAddress) +* \brief +* \param +* \return +************************************************************************/ +void prvGetRegistersFromStack (uint32_t *pulFaultStackAddress) +{ __attribute__((unused)) volatile uint32_t r0; __attribute__((unused)) volatile uint32_t r1; __attribute__((unused)) volatile uint32_t r2; @@ -407,3 +497,42 @@ void prvGetRegistersFromStack (uint32_t *pulFaultStackAddress) { * - conf_foo.h configuration of each module * - ui.c implement of user's interface (leds,buttons...) */ + +/*void Task_cdc_rx(void *parameters) +{ + #define PORT0 0 + char rcvBuf[128]; + char *pStr = rcvBuf; + int len=0; + uxHighWaterMark_cdc_rx_check = uxTaskGetStackHighWaterMark( NULL ); + + while(true) + { + if (main_b_cdc_enable) + { + int symb = udi_cdc_getc(); + if(symb) + { + len += sprintf(pStr++, "%c", symb); + } + if(symb == '\n') + { + udi_cdc_write_buf(rcvBuf, len); + pStr = rcvBuf; + len = 0; + } + } + uxHighWaterMark_cdc_rx_check = uxTaskGetStackHighWaterMark( NULL ); + } +}*/ + +/*void main_cdc_set_dtr(uint8_t port, bool b_enable) +{ + if (b_enable) { + // Host terminal has open COM + ui_com_open(port); + }else{ + // Host terminal has close COM + ui_com_close(port); + } +}*/ diff --git a/TE_Controller/src/main.h b/TE_Controller/src/main.h index 9c2a1f3..af3760a 100644 --- a/TE_Controller/src/main.h +++ b/TE_Controller/src/main.h @@ -39,6 +39,10 @@ #include "usb_protocol_cdc.h" +#define CURRENT_SENSE_RESISTENCE 0.005f +#define TEC_TEMP_MAX 35.0f +#define TEC_TEMP_MIN 5.0f +#define TEC_TEMP_NORM 25.0f typedef struct measured_params{ float TEC_Temp; @@ -62,12 +66,14 @@ typedef struct typedef struct { - float tecV; + float tecV_P; + float tecV_N; float tecI; } TecState_t; + typedef struct { - Temperatures_t temps; + Temperatures_t temps; TecState_t tecState; } Controller_t; @@ -75,14 +81,18 @@ void prvGetRegistersFromStack (uint32_t *pulFaultStackAddress); void led_configure_port_pins(void); void vApplicationMallocFailedHook (void); void vApplicationStackOverflowHook (void); -void Task_cdc_rx_check(void *parameters); +void Task_cdc_rx(void *parameters); +void Task_cdc_tx(void *parameters); void Task_led_blink(void *parameters); void Task_measure(void *parameters); void Task_regulator(void *parameters); -void InitTask_cdc_rx_check(void); +void Task_backlight(void *parameters); +void InitTask_backlight(void); +void InitTask_cdc_rx(void); void InitTask_led_blink(void); void InitTask_regulator(void); void InitTask_measure(void); +void InitTask_cdc_rx_tx(void); /*! \brief Opens the communication port * This is called by CDC interface when USB Host enable it. diff --git a/TE_Controller/src/source/adc_user.c b/TE_Controller/src/source/adc_user.c index 4e5ba31..32ae601 100644 --- a/TE_Controller/src/source/adc_user.c +++ b/TE_Controller/src/source/adc_user.c @@ -39,12 +39,6 @@ void configure_adc(void) //adc_start_conversion(&adc_instance); } -/*uint16_t adc_read_value(void) -{ - uint16_t result = 0xFFFF; - adc_read(&adc_instance, &result); - return result; -}*/ uint16_t adc_read_value(void){ adc_start_conversion(&adc_instance); uint16_t result; @@ -71,4 +65,9 @@ float adc_get_V(uint16_t value) { float Uvcc=3.3; return adc_get_Q(value) * Uvcc; +} + +float adc_get_V_spec(ADC_chan_t chan){ + uint16_t value = adc_read_value_spec(chan); + return adc_get_V(value); } \ No newline at end of file diff --git a/TE_Controller/src/source/backlight.c b/TE_Controller/src/source/backlight.c index 44bee0f..a22efbb 100644 --- a/TE_Controller/src/source/backlight.c +++ b/TE_Controller/src/source/backlight.c @@ -31,7 +31,7 @@ void backlight_event_100ms(void){ led_data[0 + (LEN_WS2812/2 - i - 1)*3 + (LEN_WS2812/2)*3] = 0x00; led_data[1 + (LEN_WS2812/2 - i - 1)*3 + (LEN_WS2812/2)*3] = 0xff; led_data[2 + (LEN_WS2812/2 - i - 1)*3 + (LEN_WS2812/2)*3] = 0x00; - }else{ + }else{ led_data[0 + i*3] = 0x00; led_data[1 + i*3] = 0x00; led_data[2 + i*3] = 0x00; @@ -63,31 +63,31 @@ void backlight_event_1s(void){ led_data[1 + i*3] = 0xff; led_data[2 + i*3] = 0xff; } - }else if((s1_cnt % modes) == 1){ + }else if((s1_cnt % modes) == 1){ for(uint16_t i=0; i < LEN_WS2812;i++){ led_data[0 + i*3] = 0xff; led_data[1 + i*3] = 0x00; led_data[2 + i*3] = 0x00; } - }else if((s1_cnt % modes) == 2){ + }else if((s1_cnt % modes) == 2){ for(uint16_t i=0; i < LEN_WS2812;i++){ led_data[0 + i*3] = 0x00; led_data[1 + i*3] = 0xff; led_data[2 + i*3] = 0x00; } - }else if((s1_cnt % modes) == 3){ + }else if((s1_cnt % modes) == 3){ for(uint16_t i=0; i < LEN_WS2812;i++){ led_data[0 + i*3] = 0x00; led_data[1 + i*3] = 0x00; led_data[2 + i*3] = 0xff; } - }else if((s1_cnt % modes) == 4){ + }else if((s1_cnt % modes) == 4){ for(uint16_t i=0; i < LEN_WS2812;i++){ led_data[0 + i*3] = 0x00; led_data[1 + i*3] = 0x00; led_data[2 + i*3] = 0x00; } - }else if((s1_cnt % modes) == 5){ + }else if((s1_cnt % modes) == 5){ mode_run_light=true; mode_run_light_cnt=0; } @@ -111,13 +111,14 @@ void backlight_init(void){ } void backlight_ws2812_sendarray(void){ - cpu_irq_disable(); + portENTER_CRITICAL();//cpu_irq_disable(); ws2812_sendarray(led_data,sizeof(led_data)); - cpu_irq_enable(); + portEXIT_CRITICAL();//cpu_irq_enable(); } void backlight_color_show(uint8_t R, uint8_t G, uint8_t B){ - for(uint16_t i=0; i < LEN_WS2812; i++){ + for(uint16_t i=0; i < LEN_WS2812; i++) + { led_data[0 + i*3] = G; led_data[1 + i*3] = R; led_data[2 + i*3] = B; diff --git a/TE_Controller/src/source/dht.c b/TE_Controller/src/source/dht.c index c7799c6..18f3f8d 100644 --- a/TE_Controller/src/source/dht.c +++ b/TE_Controller/src/source/dht.c @@ -10,7 +10,7 @@ #define lineDown() port_pin_set_output_level(DHT_Pin, 0) #define lineUp() port_pin_set_output_level(DHT_Pin, 1) #define getLine() port_pin_get_input_level(DHT_Pin) -#define Delay(d) delay_ms(d) +#define Delay(d) vTaskDelay(d) #define CPU_IRQ_enable() cpu_irq_enable() #define CPU_IRQ_disable() cpu_irq_disable() @@ -37,9 +37,9 @@ static void goToInput(void) { uint8_t DHT_getData(DHT_type t, DHT_data* p_data){ uint8_t ret; - CPU_IRQ_disable(); + //CPU_IRQ_disable(); ret = _DHT_getData(t, p_data); - CPU_IRQ_enable(); + //CPU_IRQ_enable(); return ret; } diff --git a/TE_Controller/src/source/light_ws2812_cortex.c b/TE_Controller/src/source/light_ws2812_cortex.c index f9a2c37..b9b2a57 100644 --- a/TE_Controller/src/source/light_ws2812_cortex.c +++ b/TE_Controller/src/source/light_ws2812_cortex.c @@ -30,7 +30,6 @@ #define ws2812_DEL ws2812_DEL8 ws2812_DEL2 - void ws2812_sendarray(uint8_t *data,int datlen) { uint8_t gpio_pin = PIN_PA23; diff --git a/TE_Controller/src/source/mcu_control.c b/TE_Controller/src/source/mcu_control.c index c212370..52f2b29 100644 --- a/TE_Controller/src/source/mcu_control.c +++ b/TE_Controller/src/source/mcu_control.c @@ -11,11 +11,16 @@ #include "adn8831.h" #include "tm_onewire.h" #include "tm_ds18b20.h" - +#include "adc_user.h" void MCU_control_init(void){ } +float GetTecCurrent(float currentSenseResistence) +{ + return adc_get_V_spec(chan_CS)/currentSenseResistence; +} + void MCU_control(void){ char t_TEC_str[MAX_STR_FLOAT]; char t_MCU_str[MAX_STR_FLOAT]; @@ -56,7 +61,7 @@ void MCU_control(void){ char DS1820_Temp_str[MAX_STR_FLOAT]; //bool ow_connected __attribute__((used)) =false; float DS1820_temp=0.0; - cpu_irq_disable(); + //cpu_irq_disable(); if (TM_OneWire_First(&ow_instance)) { //ow_connected=true; if(TM_DS18B20_Is(ow_instance.ROM_NO)){ @@ -71,7 +76,7 @@ void MCU_control(void){ } } } - cpu_irq_enable(); + //cpu_irq_enable(); make_float2str(DS1820_Temp_str, MAX_STR_FLOAT, (float)DS1820_temp); // printf("Info: t_MCU: %10s, t_TEC:%10s, Vin_LFB: %6s, Vin_SFB: %6s, Vin_CS: %6s, DHT22_Temp: %s, DHT22_Hum: %s, OW_STATE: %d, DS1820_Temp: %s\r\n",t_MCU_str, t_TEC_str, Vin_LFB_str, Vin_SFB_str, Vin_CS_str, DHT22_Temp, DHT22_Hum, (int)ow_connected, DS1820_Temp_str); diff --git a/TE_Controller/src/source/power_regulator.c b/TE_Controller/src/source/power_regulator.c new file mode 100644 index 0000000..5185a27 --- /dev/null +++ b/TE_Controller/src/source/power_regulator.c @@ -0,0 +1,43 @@ +/* + * power_regulator.c + * + * Created: 18.01.2021 22:07:23 + * Author: Lexus + */ +#include "power_regulator.h" + +#include +#include "tec.h" +struct tcc_module tcc_instance; + + +void temperature_control(float TEC_Temp, float *TEC_Power, bool enable) +{ + if(!enable) + { + TEC_set_level(0); + return; + } + float temp_goal=10; + float temp_diff = (temp_goal - TEC_Temp)*1; + + float TEC_intensity_max=0.5; + float TEC_power_calc = *TEC_Power; + float K=1.0/10.0; // 100% power per 20 grad. + float Power = K*temp_diff; + if(Power > 1.0) Power = 1.0; + if(Power < -1.0) Power = -1.0; + + TEC_power_calc = Power*TEC_intensity_max; + if(fabsf(fabsf(TEC_power_calc) - fabsf(*TEC_Power)) > 0.010)//(isless(TEC_power_calc,*TEC_Power) || isgreater(TEC_power_calc,*TEC_Power)) + { + *TEC_Power = TEC_power_calc; + TEC_set_level(*TEC_Power); + } +} + +/*void TEC_power_set(bool value){ + TEC_power = value; +}*/ + + diff --git a/TE_Controller/src/source/tcc_user.c b/TE_Controller/src/source/tcc_user.c new file mode 100644 index 0000000..dcff3eb --- /dev/null +++ b/TE_Controller/src/source/tcc_user.c @@ -0,0 +1,78 @@ +/* + * tcc.c + * + * Created: 18.01.2021 22:11:12 + * Author: Lexus + */ +#include "tcc_user.h" +#include "stdbool.h" +#include + +struct tcc_module tcc_instance; +struct tc_module tc_instance; +bool tc_callback_flag=false; + + +void configure_tcc(void) +{ + + struct tcc_config config_tcc; + tcc_get_config_defaults(&config_tcc, CONF_PWM_MODULE); + config_tcc.counter.clock_prescaler = TCC_CLOCK_PRESCALER_DIV1; + config_tcc.counter.period = PWM_GCLK_PERIOD; + + config_tcc.compare.wave_generation = TCC_WAVE_GENERATION_SINGLE_SLOPE_PWM; + + tcc_init(&tcc_instance, CONF_PWM_MODULE, &config_tcc); + tcc_enable(&tcc_instance); +} + +void print_tcc_status(void){ + uint32_t tcc_status, tcc_counter; + uint16_t ch; + + tcc_status = tcc_get_status(&tcc_instance); + tcc_counter = tcc_get_count_value(&tcc_instance); + printf("TCC: CNT: %6ld, STATUS: %10ld, SYNC_READY: %d, CAPTURE_OVERFLOW: %d, COUNTER_EVENT: %d, COUNTER_RETRIGGERED: %d, COUNT_OVERFLOW: %d, RAMP_CYCLE_INDEX: %d, STOPPED: %d\r\n", tcc_counter, tcc_status, + (int)((tcc_status & TCC_STATUS_SYNC_READY)?1:0), + (int)((tcc_status & TCC_STATUS_CAPTURE_OVERFLOW)?1:0), + (int)((tcc_status & TCC_STATUS_COUNTER_EVENT)?1:0), + (int)((tcc_status & TCC_STATUS_COUNTER_RETRIGGERED)?1:0), + (int)((tcc_status & TCC_STATUS_COUNT_OVERFLOW)?1:0), + (int)((tcc_status & TCC_STATUS_RAMP_CYCLE_INDEX)?1:0), + (int)((tcc_status & TCC_STATUS_STOPPED)?1:0) + ); + for(ch=0;ch<4;ch++){ + printf("channel: %d, CHANNEL_MATCH_CAPTURE: %d, CHANNEL_OUTPUT: %d\r\n", ch, + (int)((tcc_status & TCC_STATUS_CHANNEL_MATCH_CAPTURE(ch))?1:0), + (int)((tcc_status & TCC_STATUS_CHANNEL_OUTPUT(ch))?1:0) + ); + } +} + +void configure_tc(void) +{ + struct tc_config config_tc; + tc_get_config_defaults(&config_tc); + config_tc.counter_size = TC_COUNTER_SIZE_16BIT; + config_tc.clock_prescaler = TC_CLOCK_PRESCALER_DIV1024; + config_tc.counter_16_bit.compare_capture_channel[0] = 4687; // 1000ms + tc_init(&tc_instance, TC3, &config_tc); + tc_enable(&tc_instance); +} + +void tc_callback(struct tc_module *const module_inst){ + tc_callback_flag=true; + tc_set_count_value(&tc_instance, 0); +} + +void configure_tc_callbacks(void) +{ + tc_register_callback( + &tc_instance, + tc_callback, + TC_CALLBACK_CC_CHANNEL0); + tc_enable_callback(&tc_instance, TC_CALLBACK_CC_CHANNEL0); +} + + diff --git a/TE_Controller/src/source/tec.c b/TE_Controller/src/source/tec.c index 2c2b5e2..8e85b42 100644 --- a/TE_Controller/src/source/tec.c +++ b/TE_Controller/src/source/tec.c @@ -65,31 +65,34 @@ void pin_set_output(uint8_t pin, bool output_flag, uint8_t value){ port_pin_set_config(pin, &config_port_pin); } -// Range from -1 to 0 -void TEC_set_level(float value){ +// Range from -1 to 1 +void TEC_set_level(float value) +{ tcc_reset(&tcc_instance); - if(fpclassify(value) == FP_ZERO){//if(value == (float)0.0){// - // TEC OFF + if(fpclassify(value) == FP_ZERO || fpclassify(value) == FP_NAN) + { pin_set_output(PIN_SPGATE, true, 1); pin_set_output(PIN_SNGATE, true, 0); pin_set_output(PIN_LPGATE, true, 1); pin_set_output(PIN_LNGATE, true, 0); - }else{ + } + else + { struct port_config config_port_pin; port_get_config_defaults(&config_port_pin); - config_port_pin.direction = PORT_PIN_DIR_INPUT; - config_port_pin.input_pull = PORT_PIN_PULL_NONE; + config_port_pin.direction = PORT_PIN_DIR_INPUT; + config_port_pin.input_pull = PORT_PIN_PULL_NONE; port_pin_set_config(PIN_SNGATE, &config_port_pin); struct tcc_config config_tcc; tcc_get_config_defaults(&config_tcc, CONF_PWM_MODULE); - config_tcc.counter.clock_prescaler = TCC_CLOCK_PRESCALER_DIV1; - config_tcc.counter.period = PWM_GCLK_PERIOD; - - config_tcc.compare.wave_generation = TCC_WAVE_GENERATION_SINGLE_SLOPE_PWM; + config_tcc.counter.clock_prescaler = TCC_CLOCK_PRESCALER_DIV1; + config_tcc.compare.wave_generation = TCC_WAVE_GENERATION_SINGLE_SLOPE_PWM; + config_tcc.counter.period = PWM_GCLK_PERIOD; uint8_t pin_output, chan; - if(value > 0.0){ + if(value > 0.0) + { TEC_L_set(true); // to +12 pin_set_output(PIN_SPGATE, true, 1); pin_set_output(PIN_SNGATE, false, 0); @@ -99,7 +102,9 @@ void TEC_set_level(float value){ config_tcc.pins.wave_out_pin_mux[pin_output] = MUX_PA17F_TCC0_WO7; config_tcc.compare.match[chan] = PWM_GCLK_PERIOD*value; - }else{ + } + else + { TEC_L_set(false); // to GND pin_set_output(PIN_SPGATE, false, 0); pin_set_output(PIN_SNGATE, true, 0);