• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!

karomag

Members
  • Публикации

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

  • Посещение

Репутация

0 Обычный

О karomag

  • Звание
    Новенький

Информация

  • Город
    Воронеж

Электроника

  • Стаж в электронике
    Менее года
  • Сфера радиоэлектроники
    Микроконтроллеры
  • Оборудование
    Holdpeak hp-890cn
  1. Чтение температуры MAX6675

    Заработал вот такой код: #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_spi.h" float temp; void delay(void) { volatile uint32_t i; for (i=1; i != 0x1FFFF; i++) ; } int main(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); 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); //Заполняем структуру с параметрами SPI модуля SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //полный дуплекс SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; // передаем по 8 бит SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; // Полярность и SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; // фаза тактового сигнала SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // Управлять состоянием сигнала NSS аппаратно SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; // Предделитель SCK SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; // Первым отправляется старший бит SPI_InitStructure.SPI_Mode = SPI_Mode_Master; // Режим - слейв SPI_Init(SPI1, &SPI_InitStructure); //Настраиваем SPI1 SPI_Cmd(SPI1, ENABLE); // Включаем модуль SPI1.... SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set); u16 data = 0; while(1) { GPIO_ResetBits(GPIOA, GPIO_Pin_4); //Подаем сигнал CS слейву SPI_I2S_SendData(SPI1, 0); //Передаем байт 0 через SPI1 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)) //Передатчик занят? ;// значит ничего не делаем GPIO_SetBits(GPIOA, GPIO_Pin_4); //Снимаем сигнал CS if (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)) { //Если данные пришли data = SPI_I2S_ReceiveData(SPI1); temp = (data >> 3) * 0.25; } delay(); } } Получается, что принять данные надо что то отправить сначала?
  2. Чтение температуры MAX6675

    Помогите, разобраться. Пытаюсь считать данные с модуля на max6675. #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_spi.h" float temp; u16 MSBLSB; volatile uint32_t ticks_delay = 0; void SysTick_Handler(void) { ticks_delay++; } void delay(uint32_t milliseconds) { uint32_t start = ticks_delay; while((ticks_delay - start) < milliseconds); } int main(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); SPI_StructInit(&SPI_InitStructure); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_RxOnly; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; SPI_Init(SPI1, &SPI_InitStructure); SPI_Cmd(SPI1, ENABLE); SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE); NVIC_EnableIRQ(SPI1_IRQn); SysTick_Config(SystemCoreClock/1000); while(1) { temp = (MSBLSB >> 3); temp = temp * 0.25; } } void SPI1_IRQHandler (){ if (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==SET) { GPIOA->BSRR = GPIO_BSRR_BR4; MSBLSB = SPI_I2S_ReceiveData(SPI1); delay(2000); GPIOA->BSRR = GPIO_BSRR_BS4; } } Ничего хорошего пока не получилось. Код собирал по кусочкам со всего интернета(. 1. Правильно ли я настроил SPI? 2. Как преобразовать полученные данные из регистра DR в температуру? С битовыми операциями, пока туго... 3. Может кто нибудь даст пример? Прошу сильно не пинать.
  3. Изменение заданной температуры в ПИД-регуляторе

    Ну у меня этот алгоритм выполняется в цикле 10мс. //timer 3 interrupt void TIM3_IRQHandler(void) { //if interrupt happens the do this if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { //clear interrupt and start counting again to get precise freq TIM_ClearITPendingBit(TIM3, TIM_IT_Update); interruptCount++; // счетчик циклов прерываний sumU += get_adc_value(); // суммирование выборок АЦП // проверка числа выборок усреднения if (interruptCount >= MEASURE_PERIOD) { interruptCount = 0; averageU = sumU; // перегрузка среднего значения sumU = 0; flagReady = 1; // признак результат измерений готов } } } int main(void) { ... if (flagReady == 1) { flagReady = 0; adcVal = averageU / MEASURE_PERIOD; measureU = powerU / 4095 * adcVal; measureT = 99.893 * measureU + 25.012; //Опрос кнопок if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9) == 0) { setTemp -= 5; } if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10) == 0) { setTemp += 5; } //ПИД регулятор if (setTemp >= 0) { ... Разве этого не достаточно?
  4. Помогите, пжл. Сделал простенькую паяльную станцию на stm32f103c8t6. Регулировка сделана ПИД-регулятором. Все работает для заданной программно температуры. Добавил две кнопки + и -. //Опрос кнопок if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9) == 0) { setTemp -= 5; } if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10) == 0) { setTemp += 5; } //ПИД регулятор if (setTemp >= 0) { regTmpErr = setTemp - measureT; // вычисление ошибки рассогласования regTmpInt = regTmpInt + regTmpErr * koeffRegTmpInt; // интегральная часть if (regTmpInt < 0) regTmpInt = 0; // ограничение снизу if (regTmpInt > MAX_PWM) regTmpInt = MAX_PWM; // ограничение сверху regTmpPr = regTmpErr * koeffRegTmpPr; // пропорциональная часть regTmpDif = (regTmpErr - regTmpErrPrev) * koeffRegTmpDif; // дифференцирующая часть regTmpErrPrev = regTmpErr; // перегрузка предыдущей ошибки pwmVal = (u16) regTmpInt + regTmpPr + regTmpDif; // сумма составляющих if (pwmVal < DEAD_TIME) pwmVal = 0; //мертвое время ШИМ if (pwmVal > (MAX_PWM - DEAD_TIME)) pwmVal = MAX_PWM; TIM_PWMOutput(pwmVal); } else { pwmVal = 0; TIM_PWMOutput(pwmVal); } Но при нажатии, происходит, что-то для меня непонятное: нажал + температура начинает расти без остановки, - соответственно вниз температура. Что я не правильно делаю?
  5. Динамическая индикация STM32

    А с чего такой вопрос? Все так и есть.
  6. STM32 для чайника

    Интересуют программные средства.
  7. STM32 для чайника

    А что это? Каким "средством" я например могу посмотреть сигнал ШИМ на пине?
  8. STM32 для чайника

    Logic Analyser в Keil 5 работает только с некоторыми МК? Насколько я понял из описания на сайте http://www.keil.com/support/docs/3726.htm.
  9. Динамическая индикация STM32

    Это максимальный, насколько я понял из datasheet на МК на пин. Да общий пин на том же порте...
  10. Динамическая индикация STM32

    Замерил в статическом режиме на один сегмент 3,6мА, т.е."8" = 25,2мА.
  11. Описание stdlib

    @ARV Согласен, насколько позволяет опыт))) @BARS_ Не ужели подобные библиотеки, которые как я понимаю выпускает производитель настолько глюкнутые? Действительно, "подергать ножкой" можно из без библиотеки, но вот для меня настройка PWM или ADC показалась сложновато и я сделал на stdlib. Ведь гораздо быстрее, а вероятность глюка даже ниже, чем я бы сам писал(
  12. STM32 для чайника

    Подскажите, пжл, по типам данных в CooCox: u8 - uint8_t, u16 - uint16_t и т.д. Какой смысл в этих "магических" объявлениях? Как объявляется float или double, например?
  13. Описание stdlib

    Могу сказать, как новичок в этом деле, что без нее работать гораздо сложней. Это может привести к представлению о чрезмерной сложности программирования STM и отпугнуть. Что в итоге доведет до Arduino))) Я, сначала, изучаю нужную периферию и ее регистры. Но пишу в основном на stdlib. Но это я с точки зрения изучения МК как хобби. Если это профессиональный навык, обучение для дальнейшей работы в этой сфере, то конечно надо понимать хотя бы какие регистры за что отвечают. Тогда и описания библиотеки не понадобится.
  14. Динамическая индикация STM32

    Гипотетически все 8 не будут выводится. Но вы имеете, ввиду что ток будет слишком большим для всего МК? Это первый проект на STM32. Были сомнения, что я вообще смогу его реализовать, поэтому сильно в дебри не лез... Вообще в планах, сделать индикацию на двух 74HC495. Слышал, что есть какие-то спец драйверы для семисегментников. Но мне кажется это гораздо сложнее.
  15. Динамическая индикация STM32

    Да, тема подключения индикатора уже обсуждалась в другой ветке. Я по незнанию сначала подключил - все работало. Потом начал читать теорию и был удивлен: должно все сгореть)))) Но я упустил момент динамической индикации: разряды вкл поочередно на короткое время - в итоге ток получается не большой. Плюс современные индикаторы(светодиоды) требуют все меньший ток. Хотя, теперь бы сделал на "ключах". Я в институте учил Delphi. Работаю "программистом" 1С - для меня битовые операции вообще сложная тема))) Но везде применяется именно сокращенный вид присваивания. Вот и пытаюсь привыкнуть.