Jump to content

    

war4one

Свой
  • Content Count

    266
  • Joined

  • Last visited

Everything posted by war4one


  1. Здравствуйте. Я инженер-электронщик, ищу удаленную работу примерно на 20-25 часов в неделю (могу работать только вечерами и в выходные). Владею Altium Designer, SolidWorks, IAR, Visual Studio. Имею большой опыт работы с микроконтроллерами: STM32, AVR, i51, PIC. Проектирую схемы, печатные платы, разрабатываю конструкторскую и эксплуатационную документацию. Могу разработать как встроенное ПО для микроконтроллера (С/C++), так и ПО верхнего уровня под Windows (C#, WinForms, WPF, MS SQL). Список реализованных проектов. war4one@gmail.com
  2. dim371, посмотрите мое портфолио, возможно, я вам подойду. Почта war4one@gmail.com
  3. gravl4, здравствуйте. Знаю всё, что вам нужно, плюс могу делать полноценные 3D модели компонентов в SolidWorks. Но работаю только в Altium Designer, и, насколько я знаю, взаимодействие Altium <-> DipTrace не назовешь гладким. На всякий случай: резюме и портфолио.
  4. Цитата(Lninio @ Apr 26 2018, 14:20) Измените настройки компаратора событий в отношении комнат. Project / poroject options / compatator / changed room definitions Да, спасибо, помогло, только не changed room definitions, а extra room definitions.
  5. Рисую на плате Room'ы, чтобы внутри них смягчать правила через WithinRoom('SampleRoom'). Room'ы лочу, но Altium все равно удаляет их при Import Changes, приходится каждый раз вручную снимать галочки. Можно как-то обойти?
  6. У меня есть два Sheet Symbol, которые оба ссылаются на схему RS-485.SchDoc. В схеме RS-485.SchDoc определяется Net Class RS-485-External, которому на плате выставляется Clearance Rule 2 мм. На плате генерятся две комнаты, rules работают нормально, все цепи класса RS-485-External держатся на расстоянии 2 мм от остальных цепей. Теперь я хочу создать Clearance Rule, чтобы Net Class RS-485-External, находящийся в Room'е RS-485-1, держался на расстоянии 2 мм от того же класса, находящегося в Room'е RS-485-2. Как это сделать? InNetClass('RS-485-External') and WithinRoom('RS-485-1') что-то не помогает.
  7. Цитата(Skaf @ Jun 9 2017, 11:35) Необходимо разработать Ардуино-совместимый контроллер. У меня есть опыт разработок Ардуино и Ардуино-совместимой периферии (Arduino Mega, Nano, RAMPS, RepRap Controller). Вот, например, Arduino Mega в виде круга, для нестандартного 3D-станка. Моя почта io@wiredlogic.io.
  8. Есть желание сделать плату, совместимую с Arduino и пригодную для индустриальных приложений, т. е. способную корректно, без сбоев работать в условиях достаточно сильных электромагнитных помех, механических загрязнений и при высокой влажности. Если с грязью и влажностью можно будет побороться лакировкой платы, то для защиты от помех придется, похоже, довольно глубоко менять схему и печатную плату устройства. Для экспериментального подтверждения работоспособности есть термокамера Reocam TC-250 и испытательный генератор наносекундных импульсных помех ИГН 4.1М с емкостными клещами ЕК 4. Для первой попытки модернизации была выбрана Arduino Nano; сначала, чтобы не нарубить дров, было решено скопировать оригинальную схему. Если у вас есть опыт работы с Arduino, приглядитесь пожалуйста, нет ли в схеме несостыковок с первоисточником. Если дело будет доведено до конца, то разработанная плата будет доступна на тех же условиях, что и оригинальная Arduino Nano — в свободном доступе будет как схема, так и печатная плата устройства. [attachment=106287:diy_indu...lean_sch.png] [attachment=106288:diy_indu...lean_sch.pdf]
  9. Цитата(syoma @ Apr 12 2017, 08:52) Так от каких помех защищаемся? Хочу защититься от наносекундных импульсных помех (у меня есть чем проверить степень защиты), желательно и по USB, и по питанию, и по GPIO. Опыт защиты от наносекундных помех у меня небогатый; опыта защиты от микросекундных помех нет совсем, как и соответствующего лабораторного оборудования, поэтому с благодарностью выслушаю рекомендации от более опытных товарищей. При этом хотелось бы не выходить за рамки разумной стоимости компонентов; разумеется, гальванически изолированный DC/DC и оптопара на каждом GPIO кардинально улучшили бы помехозащищенность. Поэтому пока предлагаю гальваническую изоляцию USB-UART на оптронах, питание на высоковольтном (до 60 В) импульснике и защитные цепи VD-R-C на GPIO. Плюс к этому, в случае дальнейшей разработки дополнительных плат (шилдов), можно подумать и о гальванической развязке как питания, так и GPIO. Для точки отсчета можно взять Ruggeduino и Industruino; хотелось бы сделать схему "лучше" и "защищеннее".
  10. Цитата(AlexandrY @ Apr 10 2017, 16:46) полное непонимание природы и свойств помех. А какая часть схемы вызывает у вас наибольшее неприятие? Начнем, так сказать, с самого больного зуба.
  11. Всем большое спасибо за советы. Сделал первый вариант схемы с помехозащитой. Обсудим?
  12. Цитата(Gorby @ Mar 30 2017, 23:33) У вас вроде неверно цепь SCK подключена - прямо на светодиод. В оригинале она идет на вывод 17 напрямик. Спасибо большое, исправил. Была еще проблема с питанием, тоже перерисовал. Новая схема с исправленными (но возможно, не до конца) ошибками.
  13. Ethernet на STM32F107

    Имеется схема на контроллере STM32F107 и свиче KSZ8995, свич подключен к контроллеру по MII и SPI. Что работает: могу обмениваться со свичем информацией по SPI и по MDIO. Со свича идут клоки 25 МГЦ по линиям TX_CLK и RX_CLK, идет информация по линиям RXD0..RXD3, идут стробы по RX_DV. Сам свич "свичует", если подключить Ethernet к портам 1 и 2, можно через такое соединение выходить в интернет, например. Что не работает: хочу микроконтроллером принять пакет от Ethernet на самом нижнем уровне, без всяких TCP/IP, но не могу. Подозреваю, что дело в программе, что-то я настраиваю неправильно (еще и с DMA никогда не работал, а тут без него никак). Ниже программа, после настроек я в бесконечном цикле проверяю условие (DMARxDscrTab->Status & ETH_DMARxDesc_OWN) == (u32)RESET, но вхожу в это условие только дважды после старта, потом все. [attachment=63925:______KS...95_STM32.pdf] CODE// Процессор STM32F107VCT6 #include "stm32f10x.h" #include "stm32_eth.h" #define ETH_RXBUFNB 8 #define ETH_TXBUFNB 2 __IO uint32_t HSEStatus = 0; unsigned char temp = 0; unsigned int inttemp = 0; uint32_t uint32temp = 0; void SetSysClockTo72(void); // Инициализируем и раздаем клоки static void SetSysClockTo72(void); void InitGPIO(void); // Инициализируем GPIO void InitNVIC(void); // Инициализируем прерывания void InitTIM(void); // Инициализируем таймеры void InitSPI3(void); void SPI3_WriteByte(unsigned char Data); unsigned char KSZ8995_ReadByte(unsigned char Address); void KSZ8995_WriteByte(unsigned char Address, unsigned char Data); main(void) { SetSysClockTo72(); // Инициализируем и раздаем клоки InitGPIO(); // Инициализируем GPIO InitNVIC(); // Инициализируем прерывания InitTIM(); // Инициализируем таймеры GPIO_PinRemapConfig(GPIO_Remap_SPI3, ENABLE); // Делаем ремап для работы с SPI3 InitSPI3(); GPIO_SetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 \ | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); // Гасим все светодиоды GPIO_ResetBits(GPIOD, GPIO_Pin_8); // Зажигаем первый светодиод GPIO_SetBits(GPIOA, GPIO_Pin_12); // MDI-X_DISABLE в 1 GPIO_SetBits(GPIOE, GPIO_Pin_2); // ETH_PWRDN в 1 GPIO_SetBits(GPIOA, GPIO_Pin_4); // SPI CS GPIO_SetBits(GPIOE, GPIO_Pin_8); // Reset KSZ8995 (via ETH_DROP pin) Delay(2000000); GPIO_ResetBits(GPIOE, GPIO_Pin_8); Delay(2000000); GPIO_SetBits(GPIOE, GPIO_Pin_8); Delay(12000000); GPIO_SetBits(GPIOE, GPIO_Pin_4); // SCONF0 GPIO_ResetBits(GPIOE, GPIO_Pin_3); // SCONF1 GPIO_ResetBits(GPIOA, GPIO_Pin_5); // LED5-1 temp = KSZ8995_ReadByte(0x00); if (temp == 0x95) // KSZ8995 подключен и исправен { temp = KSZ8995_ReadByte(0x01); KSZ8995_WriteByte(0x01, temp|1); temp = KSZ8995_ReadByte(0x01); } ETH_InitTypeDef ETH_InitStructure; // Config Ethernet interface as MII, not RMII GPIO_ETH_MediaInterfaceConfig(GPIO_ETH_MediaInterface_MII); // Reset ETHERNET on AHB Bus ETH_DeInit(); // Software reset ETH_SoftwareReset(); // Wait for software reset while(ETH_GetSoftwareResetStatus()==SET); // Ethernet Configuration // Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter ETH_StructInit(&ETH_InitStructure); // Fill ETH_InitStructure parametrs // MAC ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;// ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;// ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable;// ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable;// ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Enable;// ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Enable;// ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;// ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;// ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;// ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;// ETH_InitStructure.ETH_Speed = ETH_Speed_100M;// unsigned int PhyAddr; for(PhyAddr = 1; 32 >= PhyAddr; PhyAddr++) { if((0x0022 == ETH_ReadPHYRegister(PhyAddr,2)) // PHYID_HIGH && (0x1450 == (ETH_ReadPHYRegister(PhyAddr,3)))) // PHYID_LOW break; } /* Configure Ethernet */ uint32temp = ETH_Init(&ETH_InitStructure, PhyAddr); /* Enable the Ethernet Rx Interrupt */ ETH_DMAITConfig(ETH_DMA_IT_NIS | ETH_DMA_IT_R, ENABLE); ETH_DMADESCTypeDef DMARxDscrTab[ETH_RXBUFNB], DMATxDscrTab[ETH_TXBUFNB]; u8 Rx_Buff[ETH_RXBUFNB][ETH_MAX_PACKET_SIZE], Tx_Buff[ETH_TXBUFNB][ETH_MAX_PACKET_SIZE]; /* Initialize Tx Descriptors list: Chain Mode */ ETH_DMATxDescChainInit(DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB); /* Initialize Rx Descriptors list: Chain Mode */ ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB); DMATxDscrTab->ControlBufferSize = 100; DMARxDscrTab->ControlBufferSize = ETH_MAX_PACKET_SIZE | (1<<14); DMARxDscrTab->Status = ETH_DMARxDesc_OWN; /* Enable MAC and DMA transmission and reception */ ETH_Start(); while(1) { if((DMARxDscrTab->Status & ETH_DMARxDesc_OWN) == (u32)RESET) { ETH_DMAReceptionCmd(DISABLE); temp = Rx_Buff[0][21]; DMARxDscrTab->Status = ETH_DMARxDesc_OWN; ETH_DMAReceptionCmd(ENABLE); } } } void InitGPIO(void) // Инициализируем GPIO { GPIO_InitTypeDef GPIO_InitStructure; // Включаем PA5, 12 на выход (LED51, MDI-X_DISABLE) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); // Включаем PA2 as alternate function push-pull GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); // Включаем PB5, 8, 11, 12, 13 as alternate function push-pull GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); // Включаем PC1, 2 as alternate function push-pull GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); // Включаем PD8, 9, 10, 11, 12, 13, 14, 15 на выход (светодиоды) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOD, &GPIO_InitStructure); // Включаем PE2, 3, 4, 8 на выход (ETH_PWRDN, SCONF1, SCONF0, ETH_DROP) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOE, &GPIO_InitStructure); } void InitNVIC(void) // Инициализируем прерывания { /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; // Enable the TIM2 Interrupt NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void InitTIM(void) // Инициализируем таймеры { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 36000; // Таймер 0.5 с TIM_TimeBaseStructure.TIM_Prescaler = 999; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ARRPreloadConfig(TIM2, ENABLE); TIM_Cmd(TIM2, ENABLE); TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); } void InitSPI3(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; /* Configure SPI3 pins: SCK and MOSI */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); /* Configure SPI3 pin MISO */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOC, &GPIO_InitStructure); /* Configure PA4 pin: CS pin */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); /* SPI3 Config */ SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI3, &SPI_InitStructure); /* SPI3 enable */ SPI_Cmd(SPI3, ENABLE); } unsigned char KSZ8995_ReadByte(unsigned char Address) { unsigned char SPI3_Read_Data = 0; GPIO_ResetBits(GPIOA, GPIO_Pin_4); // SPI CS SPI_I2S_SendData(SPI3, 3); // Send command while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_RXNE) != SET); SPI_I2S_ReceiveData(SPI3); SPI_I2S_SendData(SPI3, Address); // Read address while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_RXNE) != SET); SPI_I2S_ReceiveData(SPI3); SPI_I2S_SendData(SPI3, 0); // Push foo while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_RXNE) != SET); SPI3_Read_Data = SPI_I2S_ReceiveData(SPI3); GPIO_SetBits(GPIOA, GPIO_Pin_4); // SPI CS //Delay(8000); return SPI3_Read_Data; } void KSZ8995_WriteByte(unsigned char Address, unsigned char Data) { GPIO_ResetBits(GPIOA, GPIO_Pin_4); // SPI CS SPI_I2S_SendData(SPI3, 2); // Send command while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_RXNE) != SET); SPI_I2S_ReceiveData(SPI3); SPI_I2S_SendData(SPI3, Address); // Send address while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_RXNE) != SET); SPI_I2S_ReceiveData(SPI3); SPI_I2S_SendData(SPI3, Data); // Send data while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_RXNE) != SET); SPI_I2S_ReceiveData(SPI3); GPIO_SetBits(GPIOA, GPIO_Pin_4); // SPI CS } static void SetSysClockTo72(void) { __IO uint32_t StartUpCounter = 0, HSEStatus = 0; /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ /* Enable HSE */ RCC->CR |= ((uint32_t)RCC_CR_HSEON); /* Wait till HSE is ready and if Time out is reached exit */ do { HSEStatus = RCC->CR & RCC_CR_HSERDY; StartUpCounter++; } while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut)); if ((RCC->CR & RCC_CR_HSERDY) != RESET) { HSEStatus = (uint32_t)0x01; } else { HSEStatus = (uint32_t)0x00; } if (HSEStatus == (uint32_t)0x01) { /* Enable Prefetch Buffer */ FLASH->ACR |= FLASH_ACR_PRFTBE; /* Flash 2 wait state */ FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; /* HCLK = SYSCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; /* PCLK2 = HCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; /* PCLK1 = HCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; #ifdef STM32F10X_CL /* Configure PLLs ------------------------------------------------------*/ /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */ RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5); /* Enable PLL2 */ RCC->CR |= RCC_CR_PLL2ON; /* Wait till PLL2 is ready */ while((RCC->CR & RCC_CR_PLL2RDY) == 0) { } /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLMULL9); #else /* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */ RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9); #endif /* STM32F10X_CL */ /* Enable PLL */ RCC->CR |= RCC_CR_PLLON; /* Wait till PLL is ready */ while((RCC->CR & RCC_CR_PLLRDY) == 0) { } /* Select PLL as system clock source */ RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; /* Wait till PLL is used as system clock source */ while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) { } // Включаем тактирование GPIOs & AFIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE| RCC_APB2Periph_AFIO, ENABLE); // Включаем тактирование таймера 2 и SPI3 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_SPI3, ENABLE); // Включаем тактирование Ethernet RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ETH_MAC | RCC_AHBPeriph_ETH_MAC_Tx | RCC_AHBPeriph_ETH_MAC_Rx, ENABLE); } else { /* If HSE fails to start-up, the application will have wrong clock configuration. User can add here some code to deal with this error */ /* Go to infinite loop */ while (1) { } } }
  14. Здравствуйте, помогите решить проблемку. Есть схема счетчика электроэнергии на ADE7953, микроконтроллере и бестрансформаторном блоке питания на LNK306PN (схема подключения к электрической сети показана на рисунке). Вопрос в блоке питания на LNK306PN, а точнее, в диоде VD2 (помечен на схеме красным прямоугольником). Если бы этот блок питания питал прибор, не связанный с силовой сетью другими контактами или если бы VD2 отсутствовал (но тогда упадет мощность блока питания, а кроме показанных на схеме ADE7953 и микроконтроллера в устройстве есть еще прожорливые радио- и Wi-Fi-модули), тогда все было бы понятно. Но, боюсь, в данном конкретном случае, когда GND и SGND разделены не ферритовой бусиной, а диодом, что-нибудь да сгорит. Собственно, вопросы: 1. Прав ли я, что будут проблемы или и так все заработает? 2. Если так нельзя , то что делать. Как изменить схему, чтобы и мощность была достаточная и все работало? 3. Еще один небольшой вопрос не по основной теме - правильно ли я понял, что GND устройства нужно подключать к фазе силовой сети? До этого я делал только счетчики с гальванически изолированным блоком питания и трансформаторными токовыми входами, на GND подавалась нейтраль, однако, судя по аппликухам на однофазные счетчики Analog Device, с GND соединяется именно фаза.
  15. Цитата(Dog Pawlowa @ Jul 12 2016, 18:20) Да, схемной землей шунтовых счетчиков служит потенциал фазы. Понятно, спасибо. Цитата(Dog Pawlowa @ Jul 12 2016, 18:20) Я не работал именно с Lnk306, но клоны этой схемотехники от ST - Viper06, от TI (уже не помню) не способны выдавать на выходе напряжение 3,3 V поскольку их собственное питание больше. Проверьте. В принципе, PIXIs Designer не ругается, если выбрать выходное напряжение 3.3 В. Но у меня схема показана упрощенно, на самом деле на выходе LNK 306 12 В для переключения поляризованного реле, а 3.3 В получается потом при помощи NCP3063DR2G. Цитата(Dog Pawlowa @ Jul 12 2016, 18:20) По моему с указанным сопротивлением шунта счетчик не будет соответствовать требованиям по потерям в цепи тока. Да, похоже, по этой схеме 3.75 В*А > разрешенных 2.5 В*А. Надо подумать.
  16. Александр1, sgs — да, спасибо, вы правы, второй диод не добавляет мощности БП. В Application Note AN-37 про него сказано "Optional for improved EMI and line surge performance. Remove for designs requiring no impedance in return rail". У меня почему-то отложилось, что при расчетах в PIXIs Designer выбор Full Wave Rectification дает прибавку мощности против Half Wave, сейчас перепроверил — нет, не дает. Второй диод в данном случае можно выкинуть.
  17. Здравствуйте, помогите решить проблемку. Есть микроконтроллер с RTC и отдельной ножкой их питания, на эту ножку на случай пропажи основного питания повешен ионистор. Ионистор запитан от основного питания через диод Шоттки PMEG4010EH. Эксперименты показали, что при токе потребления RTC 2 мкА ток утечки через диод составляет около 5 мкА (и это при комнатной температуре). Соответственно, большая часть накопленной энергии тратится непродуктивно. Думаю заменить диод на PMLL4153, у которого ток утечки ~ 0.05 мкА, но гораздо больше падение напряжения, поэтому ионистор будет недозаряжаться. Плюс ток утечки диода растет при повышении температуры (устройство рассчитано на уличную эксплуатацию). Подскажите, пожалуйста, выход из такой патовой ситуации. ТЗ - нужно обеспечить питанием RTC микроконтроллера (2 мкА) в течении 5 суток, основное питание 3.3 В, RTC работоспособен до 1.8 В.
  18. Цитата(_3m @ Jun 28 2016, 11:36) 1 без изменения платы: менять тип и производителя диода шоттки. например bas40 Да, спасибо; похоже, BAS40 неплохой вариант: прямое падение напряжения в конце заряда 0.35 В даже в мороз и ток утечки < 1 мкА даже в жару. Наверное, его и поставлю. Странно, что не нашел его при помощи параметрического поиска на mouser. Цитата(_3m @ Jun 28 2016, 11:36) 2 ставить полевик но утечка у него сопоставимая, выигрыш в падении напряжения. Тут, возможно, подойдет "нормальный" полевик (тот, что по "буржуински" не MOSFET, а JFET), но надо моделировать/макетировать.
  19. Нужен монтажник в г. Уфа на разовую работу. Нужно смонтировать 10 плат, фото в аттаче. Два микроконтроллера, TQFP100 + QFN32 (металлическую "попку" припаивать не обязательно) + обвес, всего 388 точек пайки. Нужен монтаж + отмывка, лучше в ультразвуковой ванне. Сбросьте ценник на war4one@gmail.com. [attachment=99331:1.jpg] [attachment=99332:2.jpg]
  20. Всем привет. 1. Сделал самодельный Arduino Mega 2560 (перерисовал схему с оригинала и переразвел плату в нужном мне формате). Схема во вложении. 2. Залил в ATmega16U2 Arduino-COMBINED-dfu-usbserial-atmega16u2-Mega2560-Rev3.hex внешним программатором. Со стороны ПК плата видится нормально, как COM-порт Arduino Mega. При замыкании пинцетом RX-TX, идущих в сторону ATmega2560, в мониторе порта в Arduino вижу нормальное эхо. Вроде ATmega16U2 работает нормально. 3. Залил в ATmega2560 stk500boot_v2_mega2560.hex внешним программатором. При включении питания светодиод, подключенный к 26 ноге ATmega2560, начинает моргать. 4. При попытке залить скетч промаргивает светодиод RXL, подключенный к 10 ноге ATmega16U2. Светодиод TXL не горит, не мигает. Среда Arduino выдает следующий лог: avrdude: Version 6.0.1, compiled on Apr 15 2015 at 19:59:58 System wide configuration file is "C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf" Using Port : COM8 Using Programmer : wiring Overriding Baud Rate : 115200 avrdude: stk500v2_ReceiveMessage(): timeout avrdude: stk500v2_ReceiveMessage(): timeout avrdude: stk500v2_ReceiveMessage(): timeout avrdude: stk500v2_ReceiveMessage(): timeout avrdude: stk500v2_ReceiveMessage(): timeout avrdude: stk500v2_ReceiveMessage(): timeout avrdude: stk500v2_getsync(): timeout communicating with programmer avrdude done. Thank you. Подскажите, куда копать. Фьюзами игрался на обоих микроконтроллерах, не помогает. Пробовал заливать в ATmega2560 файл Mega2560-prod-firmware-2011-06-29.hex, не помогает. С Arduino работаю из под Windows 7 64-bit.
  21. STM32L052 АЦП

    Запускаю АЦП на STM32L052. Нужно читать два канала, 0 и 5, с ADC1. Скорость неважна. Если про инициализировать один канал, то все считывается нормально, и 0, и 5 показывают напряжение, приложенное к ним. Но если пытаться считывать два канала по очереди, то с обеих каналов считывается одно значение, а именно то, которое соответствует каналу, инициализированному раньше. Нашел совет полностью отключать и снова включать АЦП перед работой с другим каналом, но картина аналогичная. На настоящий момент код имеет следующий вид (засунул инициализацию в код для наглядности): CODE while(1) { AdcHandle.Instance = ADC1; AdcHandle.Init.OversamplingMode = DISABLE; AdcHandle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV1; AdcHandle.Init.LowPowerAutoPowerOff = DISABLE; AdcHandle.Init.LowPowerFrequencyMode = ENABLE; AdcHandle.Init.LowPowerAutoWait = DISABLE; AdcHandle.Init.Resolution = ADC_RESOLUTION_12B; AdcHandle.Init.SamplingTime = ADC_SAMPLETIME_7CYCLES_5; AdcHandle.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD; AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT; AdcHandle.Init.ContinuousConvMode = ENABLE; AdcHandle.Init.DiscontinuousConvMode = DISABLE; AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; AdcHandle.Init.DMAContinuousRequests = DISABLE; HAL_ADC_Init(&AdcHandle); HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_SINGLE_ENDED); sConfig.Channel = ADC_CHANNEL_0; HAL_ADC_ConfigChannel(&AdcHandle, &sConfig); HAL_ADC_Start(&AdcHandle); HAL_ADC_PollForConversion(&AdcHandle, 1000); if ((HAL_ADC_GetState(&AdcHandle) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC) { ADCValueSensor = HAL_ADC_GetValue(&AdcHandle); } HAL_ADC_Stop(&AdcHandle); HAL_ADC_DeInit(&AdcHandle); ADC_Disable(&AdcHandle); HAL_Delay(100); HAL_ADC_Init(&AdcHandle); HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_SINGLE_ENDED); sConfig.Channel = ADC_CHANNEL_5; HAL_ADC_ConfigChannel(&AdcHandle, &sConfig); HAL_ADC_Start(&AdcHandle); HAL_ADC_PollForConversion(&AdcHandle, 1000); if ((HAL_ADC_GetState(&AdcHandle) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC) { ADCValuePower = HAL_ADC_GetValue(&AdcHandle); } HAL_ADC_Stop(&AdcHandle); HAL_ADC_DeInit(&AdcHandle); ADC_Disable(&AdcHandle); HAL_Delay(100); } В переменных ADCValueSensor и ADCValuePower оседают одинаковые значения. Подскажите, куда рыть.
  22. Цитата(oleg-n @ Sep 19 2015, 19:12) Покупаю ИДЕИ+законченные разработки . Посмотрите здесь, может быть, что-нибудь приглянется.
  23. Привет! Меня зовут Михаил, я инженер-электронщик, ищу дополнительную подработку. Я специализируюсь на встроенных системах на базе микроконтроллеров, могу сделать разработку "от и до": схема, трассировка печатной платы, программное обеспечение. Кроме того, могу сделать ПО для ОС Android, самостоятельное или для связи с "железом". Подробности и список выполненных проектов вы можете посмотреть здесь.
  24. Хотел бы на основе печатной платы сделать трехмерную картинку, а лучше видео, примерно как здесь. Сейчас все проекты в PCAD2006, можно ли портировать их во что-то, что можно будет потом использовать в качестве заготовки для картинки, или нужно изучать 3D редакторы с последующим "рисованием" платы из графических примитивов?
  25. Ищу работу разработчика электроники на базе микроконтроллеров. Имею опыт разработки аппаратного и программного обеспечения, руководства коллективом разработчиков. Готов к переезду. Опыт разработки мобильных устройств, телекоммуникационной техники, КИПиА, АСТУЭ/АСКУЭ. Большой опыт практической работы с: Ethernet, GSM/GPRS, GPS/ГЛОНАСС, Bluetooth, SPI, I2C, 1-Wire, RS-232, RS-485, DTMF, LVDS/PECL, MODBUS, E1/E3, HDSL, SLIP; ARM Cortex-M3, AVR, i51, PIC, QUICC32; PCAD2006, Specctra, IAR EW, Keil µVision, CV AVR, AVR-Studio, С++ Builder, Libero, Synplify, ModelSim. Некоторый опыт работы с: Java/Android/Eclipse, PHP/HTML/mySQL/JavaScript. Водительские права категории B. Михаил, me@sepulkary.com