Jump to content

    

greenhorn

Участник
  • Content Count

    21
  • Joined

  • Last visited

Community Reputation

0 Обычный

About greenhorn

  • Rank
    Участник
  1. Добрый день! Открываю в 18.1.6 проект созданный в старой версии (16.какая-то). PCB изначально была создана в мм, шаг использовался 0.1 и 0.025 (менялся по ходу по необходимости). Выставляю мм (в View -> Toggle Units) и шаг 0.1 мм в View -> Grids (во всех подменю этого раздела, где можно). Шаг отображаемой сетки соответствует установленному, а курсор и компоненты перемещаются с шагом 6 тысячных мм ;-) Скриншот прилагается. Как сделать чтобы все только по установленной сетке перемещалось? Если создать проект с нуля в 18, то все правильно, но мне нужно существующий редактировать. В Project Options не нашел ничего похожего.
  2. Спасибо за предупреждение, Due рассматривал как-то обособленно но из-за 3.3V, думал на уровне среды там все одинаково. Я правильно понимаю что в моем случае самый правильный выбор это Mega2560 ADK? Андроид врядли понадобится но похоже это абсолютно таже Mega2560 только с USB хостом..... а... оять USB хост ;-) Он там просто как шилд на одной плате? Или опять возможны приколы как с Due? Или это вообще чисто под ADK и можно стандартный хост на шилде воткнуть?
  3. Хочу пощупать эти ардуины живьем, встал вопрос какую брать. И в связи с этим вопрос о совместимости - можно ли взять скажем самую навороченную (условно - мегу), сконфигурировать среду так, как если бы это была более простая плата (условно - нано), и сделать на ней проект под эту нано, протестировав его на реальном железе меги. С тем чтобы этот проект потом можно было залить в нано и он там заработал без изменений? Тоесть я хочу иметь возможность создвать проекты под разные платы, имея в наличии физически только одну. Так можно?
  4. Добрый день! Прошу помощи по использованию virtual_com USB стека из FRDM-KL26Z_SC: FRDM-KL26Z Sample Code Package Данный код создает виртуальный ком порт на USB и отображает на терминале вводимые символы. Код собирается без ошибок и работает на железе. Со своим чайниковским уровнем разобраться в этом коде не могу, хочу использовать как черный ящик. Виртуальный ком порт хочу использовать для вывода данных и дебага своей программы, вместо традиционного UART. Для начала просто вывести строку символов, но даже с этим у меня проблема. Использование USB принципиально, ради этого все и затевается. Собственно если развернуть этот SDK то интересующий меня пример KSDK1.1.0_KL26Z_KW01Z_1.0.0\usb\example\device\cdc\virtual_com\virtual _com.c #include "usb_device_config.h" #include "usb.h" #include "usb_device_stack_interface.h" #include "virtual_com.h" #include "fsl_device_registers.h" #include "fsl_clock_manager.h" #include "board.h" #include "fsl_debug_console.h" #include "fsl_port_hal.h" #include <stdio.h> #include <stdlib.h> #include "board.h" /***************************************************************************** * Constant and Macro's - None *****************************************************************************/ /***************************************************************************** * Global Functions Prototypes *****************************************************************************/ void TestApp_Init(void); /**************************************************************************** * Global Variables ****************************************************************************/ extern usb_desc_request_notify_struct_t desc_callback; cdc_handle_t g_app_handle; /***************************************************************************** * Local Types - None *****************************************************************************/ /***************************************************************************** * Local Functions Prototypes *****************************************************************************/ void USB_App_Device_Callback(uint8_t event_type, void* val,void* arg); uint8_t USB_App_Class_Callback(uint8_t event, uint16_t value, uint8_t ** data, uint32_t* size, void* arg); void Virtual_Com_App(void); /***************************************************************************** * Local Variables *****************************************************************************/ uint8_t g_line_coding[LINE_CODING_SIZE] = { /*e.g. 0x00,0x10,0x0E,0x00 : 0x000E1000 is 921600 bits per second */ (LINE_CODE_DTERATE_IFACE>> 0) & 0x000000FF, (LINE_CODE_DTERATE_IFACE>> 8) & 0x000000FF, (LINE_CODE_DTERATE_IFACE>>16) & 0x000000FF, (LINE_CODE_DTERATE_IFACE>>24) & 0x000000FF, LINE_CODE_CHARFORMAT_IFACE, LINE_CODE_PARITYTYPE_IFACE, LINE_CODE_DATABITS_IFACE }; uint8_t g_abstract_state[COMM_FEATURE_DATA_SIZE] = { (STATUS_ABSTRACT_STATE_IFACE>>0) & 0x00FF, (STATUS_ABSTRACT_STATE_IFACE>>8) & 0x00FF }; uint8_t g_country_code[COMM_FEATURE_DATA_SIZE] = { (COUNTRY_SETTING_IFACE>>0) & 0x00FF, (COUNTRY_SETTING_IFACE>>8) & 0x00FF }; static bool start_app = FALSE; static bool start_transactions = FALSE; static uint8_t g_curr_recv_buf[DATA_BUFF_SIZE]; static uint8_t g_curr_send_buf[DATA_BUFF_SIZE]; static uint8_t g_recv_size; static uint8_t g_send_size; /***************************************************************************** * Local Functions *****************************************************************************/ /**************************************************************************//*! * * @name USB_Get_Line_Coding * * @brief The function returns the Line Coding/Configuration * * @param handle: handle * @param interface: interface number * @param coding_data: output line coding data * * @return USB_OK When Success * USBERR_INVALID_REQ_TYPE when Error *****************************************************************************/ uint8_t USB_Get_Line_Coding(uint32_t handle, uint8_t interface, uint8_t * *coding_data) { UNUSED_ARGUMENT(handle) /* if interface valid */ if(interface < USB_MAX_SUPPORTED_INTERFACES) { /* get line coding data*/ *coding_data = g_line_coding; return USB_OK; } return USBERR_INVALID_REQ_TYPE; } /**************************************************************************//*! * * @name USB_Set_Line_Coding * * @brief The function sets the Line Coding/Configuration * * @param handle: handle * @param interface: interface number * @param coding_data: output line coding data * * @return USB_OK When Success * USBERR_INVALID_REQ_TYPE when Error *****************************************************************************/ uint8_t USB_Set_Line_Coding(uint32_t handle, uint8_t interface, uint8_t * *coding_data) { uint8_t count; UNUSED_ARGUMENT(handle) /* if interface valid */ if(interface < USB_MAX_SUPPORTED_INTERFACES) { /* set line coding data*/ for (count = 0; count < LINE_CODING_SIZE; count++) { g_line_coding[count] = *((*coding_data+USB_SETUP_PKT_SIZE) + count); } return USB_OK; } return USBERR_INVALID_REQ_TYPE; } /**************************************************************************//*! * * @name USB_Get_Abstract_State * * @brief The function gets the current setting for communication feature * (ABSTRACT_STATE) * @param handle: handle * @param interface: interface number * @param feature_data: output comm feature data * * @return USB_OK When Success * USBERR_INVALID_REQ_TYPE when Error *****************************************************************************/ uint8_t USB_Get_Abstract_State(uint32_t handle, uint8_t interface, uint8_t * *feature_data) { UNUSED_ARGUMENT(handle) /* if interface valid */ if(interface < USB_MAX_SUPPORTED_INTERFACES) { /* get line coding data*/ *feature_data = g_abstract_state; return USB_OK; } return USBERR_INVALID_REQ_TYPE; } /**************************************************************************//*! * * @name USB_Get_Country_Setting * * @brief The function gets the current setting for communication feature * (COUNTRY_CODE) * @param handle: handle * @param interface: interface number * @param feature_data: output comm feature data * * @return USB_OK When Success * USBERR_INVALID_REQ_TYPE when Error *****************************************************************************/ uint8_t USB_Get_Country_Setting(uint32_t handle, uint8_t interface, uint8_t * *feature_data) { UNUSED_ARGUMENT(handle) /* if interface valid */ if(interface < USB_MAX_SUPPORTED_INTERFACES) { /* get line coding data*/ *feature_data = g_country_code; return USB_OK; } return USBERR_INVALID_REQ_TYPE; } /**************************************************************************//*! * * @name USB_Set_Abstract_State * * @brief The function gets the current setting for communication feature * (ABSTRACT_STATE) * @param handle: handle * @param interface: interface number * @param feature_data: output comm feature data * * @return USB_OK When Success * USBERR_INVALID_REQ_TYPE when Error *****************************************************************************/ uint8_t USB_Set_Abstract_State(uint32_t handle, uint8_t interface, uint8_t * *feature_data) { uint8_t count; UNUSED_ARGUMENT(handle) /* if interface valid */ if(interface < USB_MAX_SUPPORTED_INTERFACES) { /* set Abstract State Feature*/ for (count = 0; count < COMM_FEATURE_DATA_SIZE; count++) { g_abstract_state[count] = *(*feature_data + count); } return USB_OK; } return USBERR_INVALID_REQ_TYPE; } /**************************************************************************//*! * * @name USB_Set_Country_Setting * * @brief The function gets the current setting for communication feature * (COUNTRY_CODE) * @param handle: handle * @param interface: interface number * @param feature_data: output comm feature data * * @return USB_OK When Success * USBERR_INVALID_REQ_TYPE when Error *****************************************************************************/ uint8_t USB_Set_Country_Setting(uint32_t handle, uint8_t interface, uint8_t * *feature_data) { uint8_t count; UNUSED_ARGUMENT (handle) /* if interface valid */ if(interface < USB_MAX_SUPPORTED_INTERFACES) { for (count = 0; count < COMM_FEATURE_DATA_SIZE; count++) { g_country_code[count] = *(*feature_data + count); } return USB_OK; } return USBERR_INVALID_REQ_TYPE; } /***************************************************************************** * * @name APP_init * * @brief This function do initialization for APP. * * @param None * * @return None ** *****************************************************************************/ void APP_init() { cdc_config_struct_t cdc_config; cdc_config.cdc_application_callback.callback = USB_App_Device_Callback; cdc_config.cdc_application_callback.arg = &g_app_handle; cdc_config.vendor_req_callback.callback = NULL; cdc_config.vendor_req_callback.arg = NULL; cdc_config.class_specific_callback.callback = USB_App_Class_Callback; cdc_config.class_specific_callback.arg = &g_app_handle; cdc_config.desc_callback_ptr = &desc_callback; /* Always happen in control endpoint hence hard coded in Class layer*/ #if (OS_ADAPTER_ACTIVE_OS == OS_ADAPTER_MQX) g_curr_recv_buf = OS_Mem_alloc_uncached_align(DATA_BUFF_SIZE, 32); g_curr_send_buf = OS_Mem_alloc_uncached_align(DATA_BUFF_SIZE, 32); #endif /* Initialize the USB interface */ USB_Class_CDC_Init(CONTROLLER_ID, &cdc_config, &g_app_handle); g_recv_size = 0; g_send_size= 0; } /***************************************************************************** * * @name APP_task * * @brief This function runs APP task. * @param None * * @return None ** *****************************************************************************/ void APP_task() { while (TRUE) { /* call the periodic task function */ USB_CDC_Periodic_Task(); /*check whether enumeration is complete or not */ if((start_app==TRUE) && (start_transactions==TRUE)) { Virtual_Com_App(); } }/* Endwhile */ } /****************************************************************************** * * @name Virtual_Com_App * * @brief * * @param None * * @return None * *****************************************************************************/ void Virtual_Com_App(void) { /* User Code */ if(g_recv_size) { int32_t i; /* Copy Buffer to Send Buff */ for (i = 0; i < g_recv_size; i++) { // USB_PRINTF("Copied: %c\n", g_curr_recv_buf[i]); g_curr_send_buf[g_send_size++] = g_curr_recv_buf[i]; } g_recv_size = 0; } if(g_send_size) { uint8_t error; uint8_t size = g_send_size; g_send_size = 0; error = USB_Class_CDC_Send_Data(g_app_handle, DIC_BULK_IN_ENDPOINT, g_curr_send_buf, size); if(error != USB_OK) { /* Failure to send Data Handling code here */ } } return; } /****************************************************************************** * * @name USB_App_Device_Callback * * @brief This function handles the callback * * @param handle : handle to Identify the controller * @param event_type : value of the event * @param val : gives the configuration value * * @return None * *****************************************************************************/ void USB_App_Device_Callback(uint8_t event_type, void* val,void* arg) { uint32_t handle; handle = *((uint32_t *)arg); if(event_type == USB_DEV_EVENT_BUS_RESET) { start_app=FALSE; } else if(event_type == USB_DEV_EVENT_CONFIG_CHANGED) { /* Schedule buffer for receive */ USB_Class_CDC_Recv_Data(handle, DIC_BULK_OUT_ENDPOINT, g_curr_recv_buf, DIC_BULK_OUT_ENDP_PACKET_SIZE); start_app=TRUE; } else if(event_type == USB_DEV_EVENT_ERROR) { /* add user code for error handling */ } return; } /****************************************************************************** * * @name USB_App_Class_Callback * * @brief This function handles the callback for Get/Set report req * * @param request : request type * @param value : give report type and id * @param data : pointer to the data * @param size : size of the transfer * * @return status * USB_OK : if successful * else return error * *****************************************************************************/ uint8_t USB_App_Class_Callback ( uint8_t event, uint16_t value, uint8_t ** data, uint32_t* size, void* arg ) { cdc_handle_t handle; uint8_t error = USB_OK; handle = *((cdc_handle_t *)arg); switch(event) { case GET_LINE_CODING: error = USB_Get_Line_Coding(handle, value, data); break; case GET_ABSTRACT_STATE: error = USB_Get_Abstract_State(handle, value, data); break; case GET_COUNTRY_SETTING: error = USB_Get_Country_Setting(handle, value, data); break; case SET_LINE_CODING: error = USB_Set_Line_Coding(handle, value, data); break; case SET_ABSTRACT_STATE: error = USB_Set_Abstract_State(handle, value, data); break; case SET_COUNTRY_SETTING: error = USB_Set_Country_Setting(handle, value, data); break; case USB_APP_CDC_DTE_ACTIVATED: if(start_app == TRUE) { start_transactions = TRUE; } break; case USB_APP_CDC_DTE_DEACTIVATED: if(start_app == TRUE) { start_transactions = FALSE; } break; case USB_DEV_EVENT_DATA_RECEIVED: { if((start_app == TRUE) && (start_transactions == TRUE)) { g_recv_size = *size; if(!g_recv_size) { /* Schedule buffer for next receive event */ USB_Class_CDC_Recv_Data(handle, DIC_BULK_OUT_ENDPOINT, g_curr_recv_buf, DIC_BULK_OUT_ENDP_PACKET_SIZE); } } } break; case USB_DEV_EVENT_SEND_COMPLETE: { if ((size != NULL) && (*size != 0) && !(*size % DIC_BULK_IN_ENDP_PACKET_SIZE)) { /* If the last packet is the size of endpoint, then send also zero-ended packet, ** meaning that we want to inform the host that we do not have any additional ** data, so it can flush the output. */ USB_Class_CDC_Send_Data(g_app_handle, DIC_BULK_IN_ENDPOINT, NULL, 0); } else if((start_app == TRUE) && (start_transactions == TRUE)) { if((*data != NULL) || ((*data == NULL) && (*size == 0))) { /* User: add your own code for send complete event */ /* Schedule buffer for next receive event */ USB_Class_CDC_Recv_Data(handle, DIC_BULK_OUT_ENDPOINT, g_curr_recv_buf, DIC_BULK_OUT_ENDP_PACKET_SIZE); } } } break; default: error = USBERR_INVALID_REQ_TYPE; } return error; } static void Task_Start(void *arg) { /* call the periodic task function */ USB_CDC_Periodic_Task(); /*check whether enumeration is complete or not */ if((start_app==TRUE) && (start_transactions==TRUE)) { Virtual_Com_App(); } } int main(void) { OSA_Init(); hardware_init(); dbg_uart_init(); APP_init(); OS_Task_create(Task_Start, NULL, 9L, 1000L, "task_start", NULL); OSA_Start(); USB_PRINTF("Test:\n"); return 1; } /* EOF */ Я хочу использовать что-то типа printf который будет выводить в виртуальный порт. В примере даже есть закомментированная строка // USB_PRINTF("Copied: %c\n", g_curr_recv_buf[i]); как я понимаю это какраз то что мне нужно, но если ее раскомментировать то ничего не меняется, если вставить в тело main такое - тоже. Хотя собирается без ошибок во всех случаях.
  5. В одном. Более того кроме этого единственного принтфа с UART ничего больше не работает. Опрашиваю в цикле ацп, входные PIO, вывожу результатя на печать. Больше в программе ничего нет. Прерываний и энергосберегающих режимов нет. Работаю от внутреннего RC, грешил на частоту, вывел на MCO и померял частотомером - 7.991 MHz Вот спасибо - всю голову сломал а до такого банального не додумался. Тут у меня огромная проблема с отсутствием (или немогу найти, или просто не понимаю) лоичной и последовательной документации по CMSIS и Standart Peripherial Library. По первому вообще больше по хидерам разбираюсь. Способ наверное традициооно программерский но как по мне -неправильный. В общем пока у меня с этим не сростается....
  6. Привет! Использую UART как консоль - вывожу одной строкой нужные мне данные с интервалом в секунду. Проблема в том, что ИНОГДА теряются символы. Выглядит это примерно так: 1556 mV | rise= | l | panel= | panel=4 | ltsw= 0 14 | pan curren0 | bat= 10 | bat= 1A | D= 10nt= -161 nt= -161 chg curre-165 mA | -165 mA | urrent= = 0 | = 0 | 556 mV | rise64 | ltsw=64 | ltsw=2 pan curre pan curre= 28 |00 | bat= 00 | bat= mA | D= 112195 mV | chg curr current= current=8 mA | pev6 mV | ri6 mV | ri | ref= 155se= 0 | 307 | lts307 | lts w= 0 | panel= 144 mA | D=4 mA | D=rrent= -2V | chg cuV | chg cu= 12195 mev currentev current67 mA | p556 mV | r556 mV | r | ref= 1ise= 0 | | light=anel= 2anel= 2sw= 0 | p-24 mA | D-24 mA | Drrent= = 100 | bat= 12200 -165 mA | -165 mA | urrent= mA | ref=mA | ref=nt= -167 | | 556 mV | rise= 0 | light= 302 | ltsw= 0 |current= current= 14 | pan bat= 1220 bat= 1220 D= 100 | -165 mA current=5 mA | ref5 mA | refent= -16= 1556 mV | rise= 0 | | ltsw= 0 | ltsw= 0 308 n currentn current 28 | pa= -24 mA | D= 100 hg currenhg curren195 mV | crrent= -rrent= -mA | pev cumV | rise=mV | rise=ef= 1556 0 | | light= 28 28 | 28 | 0 | panel=mA | D= 10mA | D= 10t= -33 chg curre chg curre2189 mV |current= current= mA | pev -168 mA | ref= 1556 mV | rise= 0 | light= 2 l= 28 l= 28 = 0 | pane| pan current= -3 12189 mV 12189 mV 100 | bat=66 mA | perent= -1 | ref= 15 | ref= 15 -164 mA56 mV | rise= 0 | light= 2 l= 28 = 0 | pane| pan current= -24 12195 mV 12195 mV100 | bat= | chg current= -168 mA | pev current= -166 mA | ref= 1556 mV | rise= 0 | | lig 14 | pan 14 | pan ltsw= 0 | panel= | D= 100 | D= 100 -26 mA hg currenthg current95 mV | c= -168 mA | pev cuef= 1556 mef= 1556 m68 mA | rV | rise= 0 | | light= 269 | ltsw= 0 | panel= 28 | pan current= -32 mA | D= 100 | bat= 12189 mV | chg current= -162 mA | pev current= -168 mA | ref= 1556 mV | rise= 0 | | light= 268 | ltsw= 0 | panel= 0 | pan current= -28 mA | D= 100 | bat= 12184 mV | chg current= -165 mA | pev current= -162 mA | ref= 1556 mV | rise= 0 | | light= 269 | ltsw= 0 | panel= 28 | pan current= -30 mA | D= 100 | bat= 12184 mV | chg current= -165 mA | pev current= -165 mA | ref= 1556 mV | rise= 0 | | light= 311 | ltsw= 0 | panel= 0 | pan current= -25 mA | D= 100 | bat= 12195 mV | chg current= -166 mA | pev current= -165 mA | ref= 1556 mV | rise= 0 | | light= 310 | ltsw= 0 | panel= 14 | pan current= -25 mA | D= 100 | bat= 12184 mV | chg current= -157 mA | pev current= -166 mA | ref= 1556 mV | rise= 0 | | light= 308 | ltsw= 0 | panel= 28 | pan current= -30 mA | D= 100 | bat= 12189 mV | chg current= -162 mA | pev current= -157 mA | ref= 1556 mV | rise= 0 | Сначала видно бардак поскольку часть символов выпала, в последних 6ти строках все ок. Причем я специально скопировал тот момент когда проблема пропала, при том что девайс никто не трогал и внешние условия не менялись. Вывод осуществляется одной строкой в цикле: printf("| light=%5d | ltsw=%2d | panel=%6d | pan current=%6d mA | D=%4d | bat=%6d mV | chg current=%6d mA | pev current=%6d mA | ref=%5d mV | rise=%2d |\n", light, ltsw, panel, paneli, d, bat, bati, bati_prev, ref, rise); Инициализация порта с сайта кейла: #include <stm32f0xx.h> /*---------------------------------------------------------------------------- Initialize UART pins, Baud-rate *----------------------------------------------------------------------------*/ void init_serial (void) { int i; /* Configure UART2 for 9600 baud */ RCC->AHBENR |= RCC_AHBENR_GPIOAEN; /* Enable GPIOA clock */ GPIOA->MODER |= GPIO_MODER_MODER9_1; // PA9 as alternative GP Output (USART1_TX) GPIOA->MODER |= GPIO_MODER_MODER10_1; // PA10 as AF GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9; //high speed (current?) output GPIOA->AFR[1] |= 0x110; // PA9, PA10 Alternative function 1 (USART1) enable RCC->APB2ENR |= RCC_APB2ENR_USART1EN;/* Enable USART1 clock */ USART1->BRR = 0x0341; /* Configure 9600 baud, */ for (i = 0; i < 0x1000; i++) __NOP();/* avoid unwanted output */ USART1->CR1 |= (USART_CR1_UE | USART_CR1_RE | USART_CR1_TE); // Enable USART, Receive and Transmit } /*---------------------------------------------------------------------------- Write character to Serial Port *----------------------------------------------------------------------------*/ int sendchar (int c) { while(!(USART1->ISR & USART_ISR_TXE)); USART1->TDR = (c & 0x1FF); return ©; } /*---------------------------------------------------------------------------- Read character from Serial Port (blocking read) *----------------------------------------------------------------------------*/ int getkey (void) { while (!(USART1->ISR & USART_ISR_RXNE)); return (USART1->RDR); } Сначала грешил на пролификовский адаптер, подкючил к машине с аппаратным компортом - таже фигня. Причем проблема проявляется на 2х разных контроллерах (STM32F030F4P6 b STM32F030C8T6) в разных устройствах с разной фирмварью но одинаковым кодом инициализации порта и и вывода (все приведено выше). Во втором устройстве параметров вдвое меньше в printf, соответственно отображаемая строка короче но проблема абсолютно та же. Компы тоже разные. Пробовал с ноутом работающим от батареи и устройством питающимся от другой батареи - эффект аналогичный. Обычно вывод нормализуется через час-два работы устройства (заметил случайно раза 3, уже не совпадение) но не всегда и сколько-нибудь заметного нагрева нигде нет. Форма сигнала ТХ выглядит нормально как на ноге контроллера так и на ноге ком порта (после преобразователя уровня) и одинакова при корректном выводе и "побитом". Код инициализации вроде бы понятен но непонятно зачем 0x1FF в строке USART1->TDR = (c & 0x1FF); Пробовал USART1->TDR = c; разницы никакой не обнаружил. Объясните пожалуйста зачем это нужно. Ну и главный вопрос - в чем может быть проблема с выводом.
  7. Добрый день! Ищу N-канальный MOSFET c Vgs(th)<2.4V BVdss=100V Вроде не бог весть какие параметры но не могу найти имеющиеся в наличии в Украине, (в местных магазинах если где поиск по параметрам и есть то только не по Vgs(th)) нужно срочно, в первый послепраздничный день прийти и купить. Ближайший IRLML0100 но у него Vgs(th) max 2.5V а нужно не более 2.3. В SOT-23 Посоветуйте пожалуйста что-нибудь.
  8. Добрый день! Всегда считал что токовые клещи, как любой трансформатор тока, с постоянным током не работают, но подбирая новый мультиметр обратил внимание что есть токовые клещи в описании которых явно указана возможность измерения постоянного тока. Единственное что приходит в голову - датчик Холла, но тогда должны быть жесткие требования к позиционированю датчика по отношению к проводнику в измеряемой цепи, чего, судя по описанию нет. Да и всеравно IMHO точность будет никакая при нестационарном исполнении датчика. Подскажите пожалуйста каков принцип работы таких клещей? Второй вопрос - планирую использовать такие клещи вместо вольтметра с набором низкоомных шунтов на токах 10-200А. Выглядит ГОРАЗДО удобнее при том что цены на такие клещи вполне доступные. Привык что шары не бывает и за все нужно платить ;-) Вижу что точность таких приборов немного ниже, но точность указывается в ТТХ и можно найти прибор с достаточной для меня точностью. Какие еще могут быть недостатки или особенности при измерении такими клещами вместо вольтметра с шунтом? Никогда не пользовался вообще никакими клещами и не хочу купить прибор который не вполне устроит.
  9. Привод с рекуперацией это по сути и есть резисторы в фазах (или один резистор в трехфахном віпрямителе что IMHO одно и тоже). Так все-таки (если использовать именно BLDC): ""крутить" в обратном направлении контроллером" или нагружать (рекуперация)? Это я понял из предидущего обсуждения, но такого двигателя нет. В принципе есть возможность приобрети коллектроный двигатель с обмоткаи и в статоре и в роторе (стартер турбины реактивного двигателя М701) но будет ли это лучше чем BLDC (да еще и с учетом доп затрат - BLDC уже есть а этот покупать и редуктор городить). И как тогда включать обмотки этого двигателя? Все что о нем известно со слов продавца это мощность 3-7 квт и фото ниже.
  10. Решил поднять тему а не заводить новую поскольку задача очень схожая Нужно "на коленке" сделать стенд для испытания BLDC на 1 квт, при этом испытуемый двигатель нужно как нагружать (тормозить) так и крутить (для испытания двигателя а качестве генератора). Есть в наличии второй аналогичный двигатель и первая мысль грузить их друг на друга, но пару моментов непонятно: 1.Для градуировки меряю ток потребляемый КОНТРОЛЕРОМ BLDC и статический момент (рычаг на валу + весы), как я понимаю в динамике погрешность будет обусловлена только динамическими потерями в контроллере (переключение ключей) и навскидку это порядка 10% и больше на больших оборотах, что многовато. Наверное праильнее мерять ток на фазах, но как сравнивать постоянный ток фазы застопоренного двигателя и трехфазный ток сложной формы при вращении? 2. Как правильнее тормозить испытуемый двигатель вторым двигателем - нагружая фазы второго двигателя на резисторы или "крутить" в обратном направлении контроллером?
  11. Дык я об этом в самом первом сообщении писал. Выбросы - выбросами но переходние процессы рано или поздно заканчиваются полсе чего при следующем переходе через 0 тиристор таки должен отпустить. У меня этого не происходит, вот я и не могу понять почему. Снаббер - понятно, я в сути разобраться хочу
  12. Дык тут же цепь разрывается контактами выключателя либо реле, по логике скорее всего уже при закрытом симисторе, но как решается моя проблема я не вижу... Спасибо за наводку, почитал даташит, как я понял все дело в zero cross crossing circuit, но это при включении. При выключении тиристор (симистор) должен быть сам себе zero cross crossing circuit, вот почему этого не происходит я никак понять и не могу (см выше), и с объяснением этого в основном и прошу помочь.
  13. Тут не понял какая разница какая фаза - ток падает до нуля, управление снято еще до этого, какая разница какое при этом напряжение, тиристор обязан закрыться. Проясните пожалуйста, чего я не понимаю?
  14. Приветствую! Возникла задача заменить тумблер подключения к сети 220В сетевого трансформаторного БП электрнным выключателем. БП представляет из себя киловаттный транс, на вторичке мост большая емкость итд. Первичку подключаю к сети через оптотиристор ТО132-25-5-2 включенный в диагональ моста KBPC4010. Все хорошо но тиристор иногда не закрывается при гашении его светодиода. Я понимаю что такое ток удержания но ведь ток падает до нуля каждый полупериод и оптотиристор должен закрываться в худшем случае через 20мс после гашения сетодиода (этого более чем достаточно). Подумал об индуктивном выбросе при отключении обмотки, который наверное может создавать ток удержания, но опять же - этот импульс не бесконечен и тиристор должен закрыться просто с задержкой. По цепи управления все перепроверил - светодиод гасится четко. Подскажите пожалуйста в чем может быть проблема и как лобиться надежного отключения?