Перейти к содержанию

    

greenhorn

Участник
  • Публикаций

    21
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о greenhorn

  • Звание
    Участник
  1. AD18

    Добрый день! Открываю в 18.1.6 проект созданный в старой версии (16.какая-то). PCB изначально была создана в мм, шаг использовался 0.1 и 0.025 (менялся по ходу по необходимости). Выставляю мм (в View -> Toggle Units) и шаг 0.1 мм в View -> Grids (во всех подменю этого раздела, где можно). Шаг отображаемой сетки соответствует установленному, а курсор и компоненты перемещаются с шагом 6 тысячных мм ;-) Скриншот прилагается. [attachment=112376:grid.jpg] Как сделать чтобы все только по установленной сетке перемещалось? Если создать проект с нуля в 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 CODE #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 STM32F030

    Цитата(adnega @ Jul 27 2014, 20:30) printf работает только в одном потоке? Из других потоков печатать не пытаетесь? В одном. Более того кроме этого единственного принтфа с UART ничего больше не работает. Опрашиваю в цикле ацп, входные PIO, вывожу результатя на печать. Больше в программе ничего нет. Прерываний и энергосберегающих режимов нет. Работаю от внутреннего RC, грешил на частоту, вывел на MCO и померял частотомером - 7.991 MHz Цитата(kan35 @ Jul 27 2014, 18:35) & 0x1FF нужно для того, чтобы гарантировать, что в уарт не записывается число длиннее 9 бит Вот спасибо - всю голову сломал а до такого банального не додумался. Цитата(kan35 @ Jul 27 2014, 18:35) Терять может если есть переход контроллера в режим STOP, хотя наверное у вас этого нет. Может быть проблема в терминальной программе, попробуйте логировать в файл. Цитата(kan35 @ Jul 27 2014, 18:35) Как написал выше - никаких стопов все очень тупо. А вот Bray's terminal это единственное что было неизменно во всех экспериментах, завтра буду пробовать, спасибо. Цитата(kan35 @ Jul 27 2014, 18:35) Многие параметры взяты "по умолчанию", регистры не настраивались, но вроде 8N1 должно быть нормально. Тем не менее, я все таки рекомендую пользоваться Standart Peripherial Library или CibeMX, а то проверять каждый бит настройки довольно утомительно. Тут у меня огромная проблема с отсутствием (или немогу найти, или просто не понимаю) лоичной и последовательной документации по CMSIS и Standart Peripherial Library. По первому вообще больше по хидерам разбираюсь. Способ наверное традициооно программерский но как по мне -неправильный. В общем пока у меня с этим не сростается....
  6. теряются символы UART STM32F030

    Привет! Использую 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. MOSFETы 100V с Vgs(th) <2.4V

    Добрый день! Ищу 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. Цитата(MaslovVG @ Apr 11 2012, 06:23) Правильней " "крутить" в обратном направлении контроллером?" а точнее приводом с рекуперацией. Тогда не будете свой мотор плавить. Привод с рекуперацией это по сути и есть резисторы в фазах (или один резистор в трехфахном віпрямителе что IMHO одно и тоже). Так все-таки (если использовать именно BLDC): ""крутить" в обратном направлении контроллером" или нагружать (рекуперация)? Цитата(MaslovVG @ Apr 11 2012, 06:23) Вообще для этих целей лучше всего подходит коллекторный двигатель с постоянными магнитами и реверсивный привод (лучше тиристорный) с рекуперацией Это я понял из предидущего обсуждения, но такого двигателя нет. В принципе есть возможность приобрети коллектроный двигатель с обмоткаи и в статоре и в роторе (стартер турбины реактивного двигателя М701) но будет ли это лучше чем BLDC (да еще и с учетом доп затрат - BLDC уже есть а этот покупать и редуктор городить). И как тогда включать обмотки этого двигателя? Все что о нем известно со слов продавца это мощность 3-7 квт и фото ниже. [attachment=67500:label.jpg] [attachment=67501:motor.jpg]
  10. Решил поднять тему а не заводить новую поскольку задача очень схожая Нужно "на коленке" сделать стенд для испытания BLDC на 1 квт, при этом испытуемый двигатель нужно как нагружать (тормозить) так и крутить (для испытания двигателя а качестве генератора). Есть в наличии второй аналогичный двигатель и первая мысль грузить их друг на друга, но пару моментов непонятно: 1.Для градуировки меряю ток потребляемый КОНТРОЛЕРОМ BLDC и статический момент (рычаг на валу + весы), как я понимаю в динамике погрешность будет обусловлена только динамическими потерями в контроллере (переключение ключей) и навскидку это порядка 10% и больше на больших оборотах, что многовато. Наверное праильнее мерять ток на фазах, но как сравнивать постоянный ток фазы застопоренного двигателя и трехфазный ток сложной формы при вращении? 2. Как правильнее тормозить испытуемый двигатель вторым двигателем - нагружая фазы второго двигателя на резисторы или "крутить" в обратном направлении контроллером?
  11. Дык я об этом в самом первом сообщении писал. Выбросы - выбросами но переходние процессы рано или поздно заканчиваются полсе чего при следующем переходе через 0 тиристор таки должен отпустить. У меня этого не происходит, вот я и не могу понять почему. Снаббер - понятно, я в сути разобраться хочу
  12. Цитата(Слесарь @ Mar 13 2012, 09:10) В микроволновке Миеле есть схема включения силового транса симистором. Может подойдет? Дык тут же цепь разрывается контактами выключателя либо реле, по логике скорее всего уже при закрытом симисторе, но как решается моя проблема я не вижу... Цитата(Слесарь @ Mar 13 2012, 09:10) Электродвигатели и эл. клапана я коммутирую этой схемой: Спасибо за наводку, почитал даташит, как я понял все дело в zero cross crossing circuit, но это при включении. При выключении тиристор (симистор) должен быть сам себе zero cross crossing circuit, вот почему этого не происходит я никак понять и не могу (см выше), и с объяснением этого в основном и прошу помочь.
  13. Цитата(DpInRock @ Mar 13 2012, 06:43) Фаза тока в обмотке не совпадает с фазой напряжения сети и зависит еще и от нагрузки трансформатора. Тут не понял какая разница какая фаза - ток падает до нуля, управление снято еще до этого, какая разница какое при этом напряжение, тиристор обязан закрыться. Проясните пожалуйста, чего я не понимаю?
  14. Приветствую! Возникла задача заменить тумблер подключения к сети 220В сетевого трансформаторного БП электрнным выключателем. БП представляет из себя киловаттный транс, на вторичке мост большая емкость итд. Первичку подключаю к сети через оптотиристор ТО132-25-5-2 включенный в диагональ моста KBPC4010. Все хорошо но тиристор иногда не закрывается при гашении его светодиода. Я понимаю что такое ток удержания но ведь ток падает до нуля каждый полупериод и оптотиристор должен закрываться в худшем случае через 20мс после гашения сетодиода (этого более чем достаточно). Подумал об индуктивном выбросе при отключении обмотки, который наверное может создавать ток удержания, но опять же - этот импульс не бесконечен и тиристор должен закрыться просто с задержкой. По цепи управления все перепроверил - светодиод гасится четко. Подскажите пожалуйста в чем может быть проблема и как лобиться надежного отключения?