Jump to content

Тимур1992

Members
  • Content Count

    14
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Тимур1992

  • Rank
    Новенький

Информация

  • Город
    Екатеринбург

Электроника

  • Стаж в электронике
    3-5 лет
  • Сфера радиоэлектроники
    микроконтроллеры
  • Оборудование
    паяльная станция, осциллограф, мультиметры

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Ну такая система самодиагностики это моя задумка, хотя возможно я видел это в схеме какого нибудь осциллографа, но не уверен. Вообще думаю было бы хорошо сделать 3 таких сопротивления, чтобы не просто самодиагностировать себя, но и снимать передаточную характеристику. Да, наверное придется развязку по цифре делать, так как 2 изолированных операционных усилителя, 1 DC-DC c развязкой и реле почти полностью съели отведенное место на плате. Ну в идеале, устройство рассчитано на длительную эксплуатацию, к примеру его включил и оно работает месяц-год. И я думал просто вносить корректировку при запуске и все последующие измерения делать с учетом неё. Я понимаю о какой схеме корректировки вы говорите, но так же нужна возможность схемы подключения концевиков. Поэтому мне кажется что можно как то корректировать в ПО, используя 2 канала. Щас вообще на pt10000 смотрю, там 39 Ом на градус, можно вообще не чего не корректировать XD
  2. Спасибо больше за наводку на усилитель ISO124, посмотрю его тоже. Технических требований так таковых нет(мы не достаточно большая компания чтоб позволить себе создавать лишние документы), просто нужно чтобы была возможность подключить термосопротивление и получать по нему более менее точную температуру +/- 0.5 градуса.
  3. 1. Изначально думал просто резистор на R2 510 Ом поставить. Но согласен с вами лучше заменить R2 на источник тока. Предположим я заменил. 2. Таких гальванически развязных входов АЦП будет 2. Поэтому я думал измерять pt-100...1000 по переменно разными входами и корректировку проводить вверху в ПО. 3. Честно я думаю им пренебречь, так как у серебряно-оловянных контактов оно очень мало. Либо я откажусь от pt100 и буду применять только pt1000, у него выход Ом на градус большой, 3.9 Ом. LSB (Least Significant Bit) - наименьший значащий бит. Как я понял нелинейность будет проявляться только в последнем бите.
  4. Доброго времени суток. Нужно вывести наружу устройства несколько аналоговых входов. Входы эти будут выполнять 2 функций: подключения концевиков на дверь шкафа, чтобы отслеживать открытия или к ним будет подключатся pt100-pt1000 по 3-х проводной схеме(точность нужна около 1 градуса). Входы должны быть гальванический изолированы от остальной системы, чтобы в случай произвола или ошибки монтажа остальная часть системы продолжила работать. Первый вариант был подключить внешнее АЦП, и считывать с него данные через I2C интерфейс с гальванической развязкой. Но это решение мне показалось более сложным, так как нужно наладить взаймодейтсвие через I2C и разобрать с настройками внешнего АЦП. Второй вариант, это использовать изолирующий усилитель HCPL-788J-500E и встроенное АЦП STM32F407. Мне это вариант нравиться больше так как схема упрощается. И программу проще писать. Но я до этого не когда не работал с изолированным усилителем, поэтому поднялось несколько вопросов: 1. Жизнеспособна ли эта и идея? 2. Не будет ли искажения и смещения от изолированного усилителя слишком большими? Схема видится мне примерно такой: Для облегчения наладки я решил внести в схему еще реле для возможности переключения внешнего входа на эталонный резистор R1 в 100 Ом при загрузке системы и калибровки по нему. Вообще думаю можно сделать несколько таких резисторов, только нужно тогда уже не реле использовать, а что-то более компактное. Вообще интересно будет почитать ваши комментарий и предложения.
  5. Код изначально рабочий, во всяком случай запускался на процессоре. Проблема была именно в том что я пытался собрать проект где библиотеки Си, а main на Си++.
  6. Спасибо все, кто отозвался. Проблема оказалась очень простой - я кретин. Когда я создавал проект, я подумал: хм... круто же и функционально писать код на си++. Вообщем код постоянно попадал в функцию NMI_Handler. Но не суть, когда я создал проект на чистом си, и скопировал туда свои код, то почти все сразу завелось! Вообщем, на обратную совместимость надейся, а сам не плошай ХD
  7. Доброго времени суток. Решил пробудить свои скилы по написанию программ под stm32f103. Поигрался с SMT32CUDEMX и HAL, но вернулся к SLP библиотеке. Начал постепенно наращивать программу по примерам, начиная с GPIO, тактирования и на работе c USART встал. Суть в том что передача по UART идет нормально, а вот прием приводит к "зависанию". Устанавливая бесконечные while с мигалками внутри, я выяснил что по все видимости МК не переходит в прерывания USART1_IRQHandler. Я не могу понять в чем ошибка, раньше с таким не сталкивался, хотя написал несколько программ для stm32f100 .____. Среда разработки Atollic TrusStudio 9.0.0. #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_usart.h" #include "misc.h" #include <string.h> // тактовый светодиод для индикации #define LED GPIO_Pin_5 #define RX_BUF_SIZE 80 volatile char RX_FLAG_END_LINE = 0; volatile char RXi; volatile char RXc; volatile char RX_BUF[RX_BUF_SIZE] = {'\0'}; volatile char buffer[80] = {'\0'}; void init_GPIO(void); void SetSysClockTo72(void); void init_uart(void); void clear_RXBuffer(void); void USARTSend(const char *pucBuffer); void USART1_IRQHandler(void) { GPIO_ResetBits(GPIOA, LED); //GPIOA->ODR ^= LED; //USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); //if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { //if ((USART1->SR & USART_FLAG_RXNE) != RESET) { //if ((USART1->SR & USART_SR_RXNE) != (u16)RESET) { if (USART1->SR & USART_SR_RXNE) { // Сбрасываем флаг прерывания USART1->SR &=~ USART_SR_RXNE; //RXc = USART_ReceiveData(USART1); //RX_BUF[RXi] = RXc; //RXi++; //if (RXc != 13) { // if (RXi > RX_BUF_SIZE-1) { // clear_RXBuffer(); // } //} //else { // RX_FLAG_END_LINE = 1; //} //Echo //USARTSend("Interrapt_UART1\r\n"); //USART_SendData(USART1, RXc); } //return } int main(void) { int i; //SetSysClockTo72(); init_GPIO(); init_uart(); USARTSend("Test USART1\r\n"); while (1) { //if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9) != 0) { /* Toggle LED which connected to PC13*/ GPIOA->ODR ^= LED; // Invert C13 /* delay */ for(i=0;i<0x100000;i++); /* Toggle LED which connected to PC13*/ GPIOA->ODR ^= LED; /* delay */ for(i=0;i<0x100000;i++); USARTSend("Test USART1\r\n"); //} //else { //GPIO_SetBits(GPIOA, LED); //} } } void init_GPIO(void) { // Создаем класс для постепенной настройки параметров и единовременного применени¤ GPIO_InitTypeDef GPIO_InitStructure; //Настрайваем светодиод, включаем тактирование GPIOA RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // Конфигурация для светодиода, режим работы, максимальная скорость GPIO_InitStructure.GPIO_Pin = LED; // GPIO_Mode_Out_OD выход с открытым стоком, GPIO_Mode_Out_PP выход двумя состояниями // GPIO_Mode_AF_OD выход с открытым стоком для альтернативных функций, GPIO_Mode_AF_PP то же самое, но с двумя состояниями GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // Устанавливаем начальное значение SetBits -> High level ("1"), ResetBits -> Low level ("0") GPIO_ResetBits(GPIOA, LED); // Настрайваем пин 9, регистра B на вход, для отладки, включаем тактирование регистра B RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // Настрайваем для кнопку, пин, режим, максимальная частота входного сигнала GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // GPIO_Mode_AIN аналоговый вход, GPIO_Mode_IN_FLOATING вход без подтяжки, болтающийся // GPIO_Mode_IPD вход с подтяжкой к земле, GPIO_Mode_IPU вход с подтяжкой к питанию GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } void SetSysClockTo72(void) { ErrorStatus HSEStartUpStatus; /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/ /* Системный RESET RCC (делать не обязательно, но полезно на этапе отладки) */ RCC_DeInit(); /* Включаем HSE (внешний кварц) */ RCC_HSEConfig( RCC_HSE_ON); /* Ждем пока HSE будет готов */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* Если с HSE все в порядке */ if (HSEStartUpStatus == SUCCESS) { /* HCLK = SYSCLK */ /* Смотри на схеме AHB Prescaler. Частота не делится (RCC_SYSCLK_Div1) */ RCC_HCLKConfig( RCC_SYSCLK_Div1); /* PCLK2 = HCLK */ /* Смотри на схеме APB2 Prescaler. Частота не делится (RCC_HCLK_Div1) */ RCC_PCLK2Config( RCC_HCLK_Div1); /* PCLK1 = HCLK/2 */ /* Смотри на схеме APB1 Prescaler. Частота делится на 2 (RCC_HCLK_Div2) потому что на выходе APB1 должно быть не более 36МГц (смотри схему) */ RCC_PCLK1Config( RCC_HCLK_Div2); /* PLLCLK = 8MHz * 9 = 72 MHz */ /* Указываем PLL от куда брать частоту (RCC_PLLSource_HSE_Div1) и на сколько ее умножать (RCC_PLLMul_9) */ /* PLL может брать частоту с кварца как есть (RCC_PLLSource_HSE_Div1) или поделенную на 2 (RCC_PLLSource_HSE_Div2). Смотри схему */ //RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); RCC_PLLConfig(0x00010000, RCC_PLLMul_9); /* Включаем PLL */ RCC_PLLCmd( ENABLE); /* Ждем пока PLL будет готов */ while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } /* Переключаем системное тактирование на PLL */ RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK); /* Ждем пока переключиться */ while (RCC_GetSYSCLKSource() != 0x08) { } } else { /* Проблемы с HSE. Тут можно написать свой код, если надо что-то делать когда микроконтроллер не смог перейти на работу с внешним кварцом */ /* Пока тут заглушка - вечный цикл*/ // while (1) { //} } } void init_uart(void) { /* Enable USART1 and GPIOA clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE); /* Configure the GPIOs */ GPIO_InitTypeDef GPIO_InitStructure; /* Configure USART1 Tx (PA.09) as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure USART1 Rx (PA.10) as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure the USART1 */ USART_InitTypeDef USART_InitStructure; /* USART1 configuration ------------------------------------------------------*/ /* USART1 configured as follow: - BaudRate = 115200 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled - USART Clock disabled - USART CPOL: Clock is active low - USART CPHA: Data is captured on the middle - USART LastBit: The clock pulse of the last data bit is not output to the SCLK pin */ USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); /* Enable USART1 */ USART_Cmd(USART1, ENABLE); /* Enable the USART1 Receive interrupt: this interrupt is generated when the USART1 receive data register is not empty */ USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); /* NVIC Configuration */ NVIC_InitTypeDef NVIC_InitStructure; /* Enable the USARTx Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //NVIC_EnableIRQ(USART1_IRQn); } void clear_RXBuffer(void) { for (RXi=0; RXi<RX_BUF_SIZE; RXi++) RX_BUF[RXi] = '\0'; RXi = 0; } void USARTSend(const char *pucBuffer) { while (*pucBuffer) { USART_SendData(USART1, *pucBuffer++); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) { } } }
  8. ТЕМА ЗАКРЫТА. ВСЕМ СПАСИБО! Ошибка монтажа, так быстро хотел смакетировать и потеснить схему что ошибся при распайке транзистора, эмиттер с коллектором перепутал. Долго же до меня доходило. Пересобрал полностью по новой и из новых компонентов, все работает отлично! фото ошибочно 1 варианта .___________.
  9. Вы правы. Как я это не заметил. Возможно была ошибка в монтаже. В понедельник пересоберу схему еще раз, завтра для нее отдельную плату вытравлю, а то на макетке мог маху дать. Кстати какой программой вы выполняете симулирование? Мультисим?
  10. Доброго времени суток. Есть задача разработать и изготовит источник тока (на 10-70 мА) с защитой от КЗ. С источник тока я благополучно справился, а вот с защитой от КЗ проблемы. Собрал источник тока на p-n-p транзисторе с использованием опорного источника напряжения на 2.5 В. Схема работает отлично, изменение сопротивления нагрузки приводит к изменению напряжения на выходе. Но при замыканий коллектора на землю схема выходит из стоя, так как ИОН замыкается через n-p переход транзистора на землю, через него начинает протекать ток в сотни миллиампер, и он сгорает. Я пытался ставил резистор на 2 кОм перед ИОН, но это приводило к тому что выходной ток начинал сильно зависит от напряжения питания. Либо резистор Rэ (около 100 Ом) и переход эмиттер-база шунтировали ИОП с токоограничивающим резистором на 2 кОм. Прошу помочь или дать какие либо рекомендаций кроме того сейчас рассматриваю схему источника тока, на токовом зеркале. Но опять же боюсь что испытания на КЗ не пройдет
×
×
  • Create New...