27 МОСКОВСКАЯ ВСТРЕЧА
Форум самогонщиков Сайт Барахолка Магазин 27 МОСКОВСКАЯ ВСТРЕЧА

STM32 - замена Arduino

Форум самогонщиков Автоматика
1 2 3 4 5 6 4
SedoY Профессор Новосибирск 5.1K 2.2K
Отв.60  20 Апр. 18, 23:06
arkhnchul, с частью ОЗУ, в этой же области доступной для адресации и порты были

Добавлено через 1мин.:
я написал макросыm16, 20 Апр. 18, 23:06
так то да, мало совсем не решаемых вопросов.
но костыли - это же некрасиво)))
Z_h_e Доцент г. Чайковский 1.1K 313
Отв.61  20 Апр. 18, 23:17, через 11 мин Автор был выпивший
Если предположить что были бы асм инструкции для работы с битами, разве это не был бы тот же аппаратный |=?Mnz, 20 Апр. 18, 22:59
Есть у STM очень извращенный регистр. В нем есть обычные биты, есть биты только сброс нулем (на 1 не реагируют) и в нем же тогл биты (сложение по модулю 2 или инверт при записи 1).  Допустим все тогл биты установлены и вам надо записать в обычный бит регистра 1. bit banding тут вроде просится, дешево и сердито, а хрен там. Он перевернет все тоглы в которые ничего писать не собирался.

А теперь к асму.
Берем AVR и какой-нибудь регистр статуса. В большинстве случаев флаги сбрасываются записью 1, но не во всех. Понятно что битовая команда sbi не имеет доступ к биту, вот только она видимо "знает" где надо |=, а где &= и для программера асм команда работает прозрачно и устанавливает то что хотел и не сбрасывает что не надо.
Mnz Магистр Город 254 86
Отв.62  20 Апр. 18, 23:30, через 13 мин
Посмотрел что пишут на сайте ARMа. http://infocenter.arm.com/...b/CHDJHIDF.html
Там не упоминается что это аппаратный метод |=. Пишут
Bit-banding maps a complete word of memory onto a single bit in the bit-band region. For example, writing to one of the alias words will set or clear the corresponding bit in the bitband region.
Возможно действительно аппаратный доступ к битам без чтения-модификация-запись.
Z_h_e Доцент г. Чайковский 1.1K 313
Отв.63  20 Апр. 18, 23:38, через 9 мин Автор был выпивший
Возможно действительно аппаратный доступ к битам без чтения-модификация-запись.
К сожалению нет. Слишком сложная была бы организация памяти, вернее надо было бы шину адреса в 8 раз ширее, а наверное в 32 даже.

Это я сейчас такой умный, аж череп жмет . На радиокоте я предложил использовать bit banding одному форумчанину, котрый не мог никак осилить этот извращенный регистр (это из USB). bit banding дружно сбросил все установленные тогл биты. Сам проверил тоже, конечно уже потом, а сначала надо было предложить Улыбающийся.
SedoY Профессор Новосибирск 5.1K 2.2K
Отв.64  20 Апр. 18, 23:55, через 17 мин
Z_h_e, адрес бита 32 варианта, в машинном слове (а это опять же 32 бита) уж можно как то закодировать какую то часть байтов ОЗУ и портов и адресацию бит (битовая адресация всего 5бит, остается много для вариантов). в той же моторолле машинное слово 8 бит
ну да мы ядро не разрабатываем))) просто констатирую что было бы в некоторых случаях удобно.
arkhnchul Доктор наук Москва, Уфа 990 367
Отв.65  21 Апр. 18, 16:36
1. Запускается очень долго.Z_h_e, 20 Апр. 18, 22:49
эклипс он да, такой. Ничего не поделаешь, это ява(с).
SedoY Профессор Новосибирск 5.1K 2.2K
Отв.66  21 Апр. 18, 19:05
чето в пень въехал - не работает как ожидаю (опять же привычки)
Скрытый текстtypedef struct
{
   __IO uint32_t CRL;
   __IO uint32_t CRH;
   __IO uint32_t IDR;
   __IO uint32_t ODR;
//   __IO uint32_t BSRR;
    union  {
      __IO uint32_t BSRR;
         struct {
            uint32_t adr:3;   //три первых бита -> адрес
         } ADR;//
         struct {
            uint8_t bit0:1;
            uint8_t bit1:1;
            uint8_t bit2:1;
         } ADRbites;
     };
   __IO uint32_t BRR;
   __IO uint32_t LCKR;
} adrSPI_TypeDef;
#define adrSPIM      ((adrSPI_TypeDef *) GPIOB_BASE)
#define adrSPI      adrSPIM->ADR.adr               //пример установки адреса устройства adrSPI = 5;

#define adrLed74   0   //000
#define adrDS18    1   //001
#define adr2       2   //010
#define adr3       3   //011
#define adr4       4   //100
#define adr5       5   //101
#define adr6       6   //110
#define adrAT25      7   //111

пытаюсь записывать в порт В цифру - трехбитовый адрес для переферии. происходит фигня какаято вместо адреса

Скрытый текст08001c10:   ldr r2, [pc, #116]      ; (0x8001c88 <main+308>)
08001c12:   ldrb r3, [r7, #5]
08001c14:   and.w r3, r3, #7
08001c18:   uxtb r1, r3
08001c1a:   ldrb r3, [r2, #16]
08001c1c:   bfi r3, r1, #0, #3
08001c20:   strb r3, [r2, #16]

Добавлено через 8мин.:

разобрался, юзал вместо ODR (нужно его) - BSRR
ну да сам виноват, внимательность проявлять надо
arkhnchul Доктор наук Москва, Уфа 990 367
Отв.67  21 Апр. 18, 23:04
оригинально так) Зачем всю структуру gpio перетаскивать?
...
typedef struct {
    uint32_t addr:3;
} addr_tmp_t;

#define adrSPI (((addr_tmp_t *)(&(GPIOB->ODR)))->addr)
...
SedoY Профессор Новосибирск 5.1K 2.2K
Отв.68  22 Апр. 18, 07:40
arkhnchul, копипаст был быстрее, а думать было лень в тот момент, по этой же причине и в пень въехал - думать было лень сразу
опять же, с тех пор как писал - уже сын вырос и в армию ушел, все приемы по памяти, по этому тапками не кидать, прошу снисходительно относится, примеров в сети найти дельных не всегда удается, заполОнила ардуина все))))

Добавлено через 8мин.:

взлетело.
развертка для 7х4 светодиодного индикатора подключенного через два 74НС595 по SPI и прерывания. ядро спит.
нравится STM32

Скрытый текст

void SysTick_Handler(void)
{
//------7сегментный4позиции индикатор отображение развертка начало------//
   if ( tickwait == tickuwTick ) {   tickwait =  tickuwTick + DynamicScan; //осчёт интервала в мс
   adrSPI = adrLed74;                  //сбросить бит на LOW - начало обмена, защелкнули входные данные в 589 - передача, 595 - прием
   SPI1->DR = Data2ToSend[pos7Segment];   //загружаем данные для передачи
   SPI1->CR2 |= SPI_CR2_RXNEIE;         //разрешить прерывание по заполнении приемного буфера
   SPI1->CR1 |= SPI_CR1_SPE;            //включаем SPI
   if ( pos7Segment++ == 4 ) {
        pos7Segment = 0;
     }
   }
}



void SPI1_IRQHandler(void)
{
   uint16_t tmp1 = 0;

   //причина прерывания - принят байт данных
   if(SPI1->SR & SPI_SR_RXNE)   {
      adrSPI = adrAT25;               //установить бит, защелкнули выходные данные в 595->вывод HIGH, устанавливаем значения на выходах
      tmp1 = SPI1->DR;               //прочитать принятые данные (опрос клавиатуры)
      SPI1->CR2 &= ~SPI_CR2_RXNEIE;      //запретить прерывание
      SPI1->CR1 &= ~SPI_CR1_SPE;         //выключаем SPI
      //выполняем какие-то действия
      return;//
   }

//     //причина прерывания - окончание передачи байта
//       if(SPI1->SR & SPI_SR_TXE) {
//          //выполняем какие-то действия
//          return;//
//       }
}


arkhnchul Доктор наук Москва, Уфа 990 367
Отв.69  22 Апр. 18, 16:40
if(SPI1->SR &= SPI_SR_RXNE)SedoY, 22 Апр. 18, 07:40
нене, это всегда будет истинно. Просто &, без =
SedoY Профессор Новосибирск 5.1K 2.2K
Отв.70  22 Апр. 18, 17:03, через 24 мин
arkhnchul, исправил в примере, а ведь с примера в сети взял, и от себя добавил)))
Mnz Магистр Город 254 86
Отв.71  03 Мая 18, 21:35
В продолжение темы фазового симисторного регулятора, сделал модуль, подключаемый по I2C и позволяющий изменять время открытого состояния симистора от 0 до 100% с разрешающей способностью 0.01%. Микроконтроллер выбран STM32F030F4P6 самый дешевый из STM32, который можно купить за 0.5$ при партии от 5 штук. https://ru.aliexpress.com/...2867950193.html

Схема.

Скрытый текст
STM32 - замена Arduino
STM32 - замена Arduino. Автоматика.

Регулятор 3-ех канальный. Для обеспечения приемлемой точности при разрешающей способности 0.01%, в него добавлена функция измерения частоты сети и автоматической корректировки времени открытия симистора в зависимости от частоты.

Несколько картинок работы регулятора.

Частота сети.
Скрытый текст
STM32 - замена Arduino
STM32 - замена Arduino. Автоматика.

Первый канал (50.00%).
Скрытый текст
STM32 - замена Arduino
STM32 - замена Arduino. Автоматика.

Второй канал (1.00%).
Скрытый текст
STM32 - замена Arduino
STM32 - замена Arduino. Автоматика.

Работа защиты от пропадания частоты сети.
Скрытый текст
STM32 - замена Arduino
STM32 - замена Arduino. Автоматика.

Протокол обмена по I2C.
____________________________________________________________________________________________
|   Команда    |   Параметр (1 байт)  |                       Данные                       |
|__________________________________________________________________________________________|
| SetPower (w) | № канала (0 - 3) (w) | Младший байт данных (w) | Старший байт данных (w)  |
|------------------------------------------------------------------------------------------|
| GetPower (w) | № канала (0 - 3) (w) | Младший байт данных (r) | Старший байт данных (r)  |
|------------------------------------------------------------------------------------------|
| GetHz001 (w) |        ----          | Младший байт данных (r) | Старший байт данных (r)  |
--------------------------------------------------------------------------------------------

Сокращения в таблице.
(w) - запись мастером. (r) - чтение мастером.


CMD_SetPower = 1  // Задание процента открытия симистора (0-10000) что равно 0 - 100.00%.
CMD_GetPower = 2  // Чтение процента открытия симистора.
CMD_GetHz001 = 3  // Чтение частоты сети в Гц * 100. Частота 50.2 Гц будет прочитана как 5020.

I2C_Addr = 0x10;  // Адрес I2C.

Микроконтроллер питается напряжением 3.3 вольта. От 5 вольт нормально работать не будет. Это же относится к сигнальным линиям (вход детектора нуля, I2C и т. д.).

В этой конструкции по максимуму задействованы аппаратные возможности МК, что может показаться даже излишне усложнило программу. Формирование управляющих импульсов для симисторов производится аппаратно без прерываний. Измерение частоты сети также сделано аппаратно (таймер настроен на ШИМ захват и имеет разрешающую способность одна микросекунда) с последующим копированием результата в массив через DMA. Раз в секунду (при частоте полупериода 100 Гц), производится усреднение результатов и при необходимости (если частота сети изменилась) коррекция работы таймера управляющего симисторами.

Если не нужно точно знать частоту сети (ее можно запросить по I2C), из схемы можно исключить кварцевый резонатор и конденсаторы C1 и C2. На точность регулятора это не повлияет, поскольку он синхронизируется с частотой сети. Правда это по какой-то причине увеличивает ток потребления до 12 миллиампер (при наличии кварца он равен 8 миллиампер). Возможно из-за большего коэффициента умножителя (с кварцем он 6, а без него 12) для достижения номинальной частоты 48 МГц. Но может дело в чем-то другом.
4.png
4.png STM32 - замена Arduino. Автоматика.
1.png
1.png STM32 - замена Arduino. Автоматика.
2.png
2.png STM32 - замена Arduino. Автоматика.
3.png
3.png STM32 - замена Arduino. Автоматика.
Схема.GIF
Схема.GIF STM32 - замена Arduino. Автоматика.

TriacModule_STM32F030F4P6_1.0.zip 378.9 Кб
m16 Модератор Тамбов 1.9K 1K
Отв.72  03 Мая 18, 22:47
позволяющий изменять время открытого состояния симистора от 0 до 100% с разрешающей способностью 0.01%Mnz, 03 Мая 18, 21:35
задавать мощность в процентах от максимального угла открытия симистора путь тупиковый  поскольку нет прямой зависимости между углом открытия и напряжением на тэне. а выглядит это так:
rms.png
Rms. STM32 - замена Arduino. Автоматика.

опять же формула справедлива для чистого синуса  чего в сети и близко не наблюдается. посему нужно идти от обратного - измерять rms  напряжение(ток,мощность) на нагрузке и изменением  угла открытия делать возможно близким к  заданному напряжению(току,мощности). по сути стабилизация заданного параметра.

частоту сети измерять - совсем бессмысленные телодвижения. зачем?
Mnz Магистр Город 254 86
Отв.73  03 Мая 18, 23:02, через 15 мин
частоту сети измерять - совсем бессмысленные телодвижения. зачем?m16, 03 Мая 18, 22:47
Допустим задали время открытого состояния симистора 50%. При частоте полупериода 100 Гц это равно 5 миллисекунд. Допустим что частота изменилась и стала 90 Гц (маловероятно, но всякое возможно). Чтобы получить те же 50%, нужно время открытого состояния увеличить до 5.555 миллисекунд.
Z_h_e Доцент г. Чайковский 1.1K 313
Отв.74  03 Мая 18, 23:06, через 5 мин
Единственое что в сети точно держат как раз частоту.
m16 Модератор Тамбов 1.9K 1K
Отв.75  03 Мая 18, 23:27, через 21 мин
Допустим задали время открытого состояния симистора 50%.Mnz, 03 Мая 18, 23:02
опять ты за своё. ОК.
скажи, в чём глубинный смысл установки неизвестной мощности на тэне  путём установки  времени  открытия симистора? и почему время в %?
arkhnchul Доктор наук Москва, Уфа 990 367
Отв.76  03 Мая 18, 23:47, через 20 мин
Допустим задали время открытого состояния симистора 50%Mnz, 03 Мая 18, 23:02
имхо сначала вопрос в том, что, поелику уж се отдельное устройство, куда удобнее ему со стороны управляющего контроллера для удержания задавать несколько более абстрактное значение - RMS ток/напряжение или мощность. А там уж конем оно прелюбодействуй, пусть сам разгребается с частотами и процентами.
m16 Модератор Тамбов 1.9K 1K
Отв.77  03 Мая 18, 23:52, через 6 мин
Первый канал (50.00%).Mnz, 03 Мая 18, 21:35
Второй канал (1.00%).Mnz, 03 Мая 18, 21:35
здесь у тебя косяки.   моську рекомендуется открывать импульсом  t_gate длительностью не менее 200мкс и снимать импульс не менее чем за 250мкс до прихода ноля сети.
rm.jpg
Rm. STM32 - замена Arduino. Автоматика.


Добавлено через 4мин.:

куда удобнее ему со стороны управляющего контроллера для удержания задавать несколько более абстрактное значениеarkhnchul, 03 Мая 18, 23:47
а нахрена управляющему контроллеру заниматься этой ерундой, F030 сам справится и rms  посчитать и угол выдать.
arkhnchul Доктор наук Москва, Уфа 990 367
Отв.78  04 Мая 18, 00:07, через 15 мин
а нахрена управляющему контроллеру заниматься этой ерундой, F030 сам справится и rms  посчитать и угол выдать.m16, 03 Мая 18, 23:52
я об этом, да. Если в основных мозгах заморачиваться процентами и частотой (напряжение или ток, кстати, где?), то зачем второй контролер - ногой дрыгать?
Mnz Магистр Город 254 86
Отв.79  04 Мая 18, 11:26
В микроконтроллере есть 4 свободных входа (PA4, PA5, PA7, PB1) каналов АЦП. Их можно задействовать для измерения напряжения и тока. В МК есть свободный таймер TIM1 который может генерировать события запуска АЦП, который в свою очередь используя DMA будет помещать результаты измерения в массив. По заполнению массива и прерыванию от DMA нужно произвести расчеты и скорректировать время открытия симистора.
АЦП 12-ти разрядный и довольно быстрый. В даташите написано 1 миллион измерений в секунду.