STM32F103 & Arduino IDE

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

a5021 пишет:

До 65 раз доходит.

Какая-то странная табличка.

Ну, во-первых, почему-то на AVR плавающая арифметика работает быстрее целочисленной. Из 4-х арифметических операций только деление медленее, остальные - быстрее и намного.

Во-вторых, почему 64*8=512 байтов не умещаются в память Uno? И почему 512*8=4к не умещается в память f103?

Хотя по абсолютным величинам результаты, по крайней мере для Maple, похожи на истину.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Я правильно понимаю, что UNO хороший камень?

 

mixail844
Offline
Зарегистрирован: 30.04.2012

ua6em пишет:

Я правильно понимаю, что UNO хороший камень?

 

UNO это не камень ,это модель платформы ардуино .так же есть Mega , DUE и т.д

хороший для чего ? вот скажем дом строить, так себе .

a5021
Offline
Зарегистрирован: 07.07.2013

ua6em пишет:
Я правильно понимаю, что UNO хороший камень?

Угу. Каменный камень.

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

ua6em пишет:
Я правильно понимаю, что UNO хороший камень?

Угу, а ви с какой целью интересуетесь? ))

MaksVV
Offline
Зарегистрирован: 06.08.2015

mixail844 пишет:

ua6em пишет:

Я правильно понимаю, что UNO хороший камень?

 

хороший для чего ? вот скажем дом строить, так себе .

ну, в неумелых руках этот камень может превратиться в кирпич. А это уже не каменный век. Можно и строительство начинать. 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Probelzaelo пишет:

ua6em пишет:
Я правильно понимаю, что UNO хороший камень?

Угу, а ви с какой целью интересуетесь? ))

Писал программки для PIC16F на ассемблере, код минимальный, интересуюсь возможно ли это на 328 камне, а то простое моргание светодиодиком в сотню байт кода выходит )))
 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

mixail844 пишет:

ua6em пишет:

Я правильно понимаю, что UNO хороший камень?

UNO это не камень ,это модель платформы ардуино .так же есть Mega , DUE и т.д

хороший для чего ? вот скажем дом строить, так себе .

мой приятель кстати дом постоил на изделиях на PIC контроллере )))

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

ua6em пишет:

Писал программки для PIC16F на ассемблере, код минимальный, интересуюсь возможно ли это на 328 камне, а то простое моргание светодиодиком в сотню байт кода выходит )))

Возможно. Вот ассемблерные инструкции для AVR, вот книжки Евстифеева по "микроконтроллерам AVR" и Ревича по "практическому программированию микроконтроллеров AVR на языке ассемблера".

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ua6em пишет:

Probelzaelo пишет:

ua6em пишет:
Я правильно понимаю, что UNO хороший камень?

Угу, а ви с какой целью интересуетесь? ))

Писал программки для PIC16F на ассемблере, код минимальный, интересуюсь возможно ли это на 328 камне, а то простое моргание светодиодиком в сотню байт кода выходит )))
 

Аналогично. 

Ассемблер для пика приятный, а с микрочиповским си как-то не сложилось. В принципе все работает, но библиотек минимально так что все ручками писать надо. Хотя у пика есть несомненное преимущество - сверхнизкая скорость тактования 32кГц. Для нескоростных проектов дает очень низкое энергопотребление.

А у ардуинки и библиотеки, и справочники, и форумы и паять не надо. Вот только STM32 в протеусе не эмулируется, а пик - запросто.

a5021
Offline
Зарегистрирован: 07.07.2013

mykaida пишет:
Вот только STM32 в протеусе не эмулируется

Вообще-то эмулируется.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

mykaida пишет:

 Хотя у пика есть несомненное преимущество - сверхнизкая скорость тактования 32кГц. Для нескоростных проектов дает очень низкое энергопотребление.

дак это и у AVR есть, хоть от 1 Герца тактуй

Logik
Offline
Зарегистрирован: 05.08.2014

andriano пишет:

Какая-то странная табличка.

...

Во-вторых, почему 64*8=512 байтов не умещаются в память Uno? И почему 512*8=4к не умещается в память f103?

Хотя по абсолютным величинам результаты, по крайней мере для Maple, похожи на истину.

И 64 и 128 умещаются в 328p разумеется, и общитываются побыстрей чем в таблице. Так что с абсолютными для Uno - лажа.

a5021
Offline
Зарегистрирован: 07.07.2013

Это такой особый вид IT-окультизма -- не видя исходников, гадать о требованиях к памяти и предсказывать скорость вычислений? Я давал здесь ссылку на статью, но ее потерли. Наверное, чтобы окультисты не чувствовали себя обделенными и всегда могли блеснуть чем-нибудь, да произвести впечатление на легковерных.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

FFT - это вполне конкретный алгоритм. Для того, чтобы оценить требуемый объем памяти и затраты времени на обработку, видеть конкретный код совершенно не нужно.

А если вдруг окажется, что результаты, демонстрируемые этим "конкретным кодом" сильно отличаются от оценок, можно безошибочно утверждать, что место этому коду - в мусрорной корзине, и в качестве демонстрационной задачи использовать этот код категорически нельзя.

ssss
Offline
Зарегистрирован: 01.07.2016

a5021 пишет:

чтобы окультисты не чувствовали себя обделенными и всегда могли блеснуть чем-нибудь, да произвести впечатление на легковерных.

Не переживай так сильно... держи хвост пистолетом... Слабым и тупым оппонентам всегда завистно... Ты ж сам когда-то истерил по малейшему поводу... не понимая о чём тебе говорят... Теперь тебя не понимают... ибо ты вырос... над самим собой...

ssss
Offline
Зарегистрирован: 01.07.2016

andriano пишет:

FFT - это вполне конкретный алгоритм. Для того, чтобы оценить требуемый объем памяти и затраты времени на обработку, видеть конкретный код совершенно не нужно.

Все эти дэ и корэ марки и прочая хрень... только для приблизительного анализа... Поэтому очень серьёзно... их рассматривать не стоит... Да и... ИМХО... никто такой задачи изначально не ставил...

Но для любителей поспорить... это просто ЛАФА... ))))))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ssss пишет:

Все эти дэ и корэ марки и прочая хрень... только для приблизительного анализа... Поэтому очень серьёзно... их рассматривать не стоит... Да и... ИМХО... никто такой задачи изначально не ставил...

По производительности - "да" по всем трем пунктам.

А по объему памяти - линейный коэффициент вычисляется абсолютно точно.

a5021
Offline
Зарегистрирован: 07.07.2013

Исходники kissFFT доступны. Никогда не мешает расширить свои представления.

mag155
Offline
Зарегистрирован: 21.12.2017

Подскажите нашел много настроек для таймера stm32 через Ardyino.  Но вот как настроить таймер с det taim  нигде нет и про комплементарную настройку каналов таймера ни слова. Подскажите где искать ???

nik182
Offline
Зарегистрирован: 04.05.2015

an4013 из базы ST

b707
Offline
Зарегистрирован: 26.05.2017

mag155 пишет:

 Но вот как настроить таймер с det taim  нигде нет и про комплементарную настройку каналов таймера ни слова.

в ардуино это не настраивается

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

mag155 пишет:

Подскажите нашел много настроек для таймера stm32 через Ardyino.  Но вот как настроить таймер с det taim 

Тока щас дошло, что речь про deadtime. :-)

mag155
Offline
Зарегистрирован: 21.12.2017

То есть только что то типа keil .Без вариантов?

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

DetSimen пишет:

mag155 пишет:

Подскажите нашел много настроек для таймера stm32 через Ardyino.  Но вот как настроить таймер с det taim 

Тока щас дошло, что речь про deadtime. :-)

Семён Семёнович... )))

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

mag155 пишет:
То есть только что то типа keil .Без вариантов?

mag155, вы уже год на форуме, неужели до сих пор не пришло какое-то минимальное понимание основ программ, с которыми работаете?  Конечно вариантов дофига. Пишите в чём вам нравится, хоть в notepad. Начинающему всяко проще будет в Arduino IDE, но без знания аппаратной части МК, без умения её конфигурировать вы всё равно не настроете синхронную работу таймеров с дид-таймами, какую бы вы программу не выбрали. Стекущем уровнем подготовки вы сможете только повторить чей то готовый проект.

mag155
Offline
Зарегистрирован: 21.12.2017

Я ж не программист даже не когда этому не учился. А то что год на форуме времени не так много получается выделить только час ну максимум 2 в день. Тк основная работа совсем в другом направлении.

mag155
Offline
Зарегистрирован: 21.12.2017

//Arduino Atmega 1280 2560 good version 3 phase induction motor Variable Speed Controller //Code
// Complier By Arduino Version 101 Version 106 Software
//รุ่นนี้เป็นแบบ AUTO RE RUN โค๊ดนี้ใช้วอลลุ่ม 5KB ตัวเดียวทำหน้าที่ ปิด -ปิด ปรับรอบ ให้ใช้ R //4K7 ต่อ ไฟ+5Vdc แล้วต่อเข้า ขาข้างด้าน + MAX ของ VR ต่อ R 1K-10 K ต่อ เข้า A3 ของ //ATmega 168 ATmega 328 P
#include "arduino.h" //Store data in flash (program) memory instead of SRAM
#include "avr/pgmspace.h"
#include "avr/io.h"
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define UN (400.0)
#define FN (50.0)
#define P (UN/FN)
#define T_PWM (0.000255)
#define T_MAX (4.0)
#define T_MIN (0.02)
#define K_MAX floor(T_MAX/T_PWM)
#define K_MIN ceil(T_MIN/T_PWM)
volatile static unsigned int dlugosc_tab_sin; //okresie napiecia wyjsciowego
static unsigned int i = 0;
volatile static unsigned int licznik_glowny = 0;

static unsigned int next_value_sin = 0;
static double t_param=100;
static float t = T_PWM;
static float omega_t;
static float t_out;
static float U_o_param;

static unsigned int ocr0a, ocr0b, ocr1a;
static unsigned int ocr1b, ocr2a, ocr2b;
static unsigned int ocr3a, ocr3b, ocr3c;
static unsigned int ocr4a, ocr4b, ocr4c;//^
static unsigned int ocr5a, ocr5b, ocr5c;//
static double sin_in;
static double blad = 1;
static unsigned int analog=0;
static double U_in = 0;
static double U_rms_max;
static bool a=0;
int main()
{
io_init();
timers_init(); //inicjalizacja licznikow PWM
adc_init(); //inicjalizacja przetwornika ADC
while(1) //nieskonczona petla z programem glownym
{
if(i==185) //warunek okreslajacy wejscie do funkcji zmiany
{ //parametrow napiecia wysjciowego, wywolanie co okolo 100ms
zmien_predkosc(); //funkcja zmiany parametrow napiecia wyjsciowego
i=0;
}
next_value_sin = licznik_glowny%dlugosc_tab_sin; //kolejna wartoœๆ sinusa do obliczenia
sin_in=omega_t*next_value_sin;

//obliczenie wartosci do rejestrow okreslajacych wypelnienie sygnalu wyjscioweg/
ocr0a = round(blad*(U_o_param*(sin(sin_in)+1)*254/2)+1);//pin D 13
ocr0b = ocr0a - 1;//pin D 4
ocr1a = round(blad*(U_o_param*(sin(sin_in-2.09)+1)*254/2)+1);//pin D 11
ocr1b = ocr1a - 1;//pin D 12
ocr2a = round(blad*(U_o_param*(sin(sin_in+2.09)+1)*254/2)+1);//pin D 10
ocr2b = ocr2a - 1;//pin D 9

ocr3a = round(blad*(U_o_param*(sin(sin_in)+1)*254/2)+1);//pin D 5
ocr3b = ocr3a-1;//r3a-1;//ocr3a - 1;//pin D 2
ocr4a = round(blad*(U_o_param*(sin(sin_in-2.09)+1)*254/2)+1);//pin D 6
ocr4b = ocr4a-1;//ocr3c-1;//ocr3c - 1;//pin D 7
ocr5a = round(blad*(U_o_param*(sin(sin_in+2.09)+1)*254/2)+1);//pin D 46
ocr5b = ocr5a-1;//ocr4a -1; //pin D 45

ocr3c = ocr0b;//round(blad*(U_o_param*(sin(sin_in)+1)*254/2)+1);//pin D 3
ocr4c = ocr1b;//round(blad*(U_o_param*(sin(sin_in+2.09)+1)*254/2)+1);//pin D 8
ocr5c = ocr2b;//round(blad*(U_o_param*(sin(sin_in-2.09)+1)*254/2)+1);//pin D 44

//uaktualnienie wartosci w rejestrach/
cli(); //zabronienie na obsloge przerwan na wypadek gdyby
//podczas uaktualniania wystapilo przerwanie
OCR0A = ocr0a; //pin D13
OCR0B = ocr0b; //pin D4
OCR1A = ocr1a; //pin D11
OCR1B = ocr1b; //pin D12
OCR2A = ocr2a; //pin D10
OCR2B = ocr2b; //pin D9

OCR3A = ocr3a; //pin D5
OCR3B = ocr3b; //pin D2
OCR3C = ocr3c; //pin D3
OCR4A = ocr4a; //pin D6
OCR4B = ocr4b; //pin D7
OCR4C = ocr4c; //pin D8

OCR5A = ocr5a; //pin D46
OCR5B = ocr5b; //pin D45
OCR5C = ocr5c; //pin D44

sei(); //zezwolenie na obsloge przerwan
i++;
}
}
void adc_init()
{
ADCSRA |= _BV(ADEN);//uruchomienie przetwornika
ADCSRA |= _BV(ADPS2);//ustawienie preskalera
ADCSRA |= _BV(ADPS1);//^
ADCSRA |= _BV(ADPS0);//^
ADMUX |= _BV(REFS0);// napiecie odniesienia ustawione jako napiecie zasilania
ADMUX |= ADMUX &= 0b11110000; //wybranie wejscia ADC0 do pomiaru
}
void timers_init()
{
cli(); // obsloga przerwan zabroniona
TCCR0A |= _BV(COM0A1) | _BV(COM0B0) | _BV(COM0B1) | _BV(WGM00);
TCCR0B |= _BV(CS01); //preskaler 8
TIMSK0 |= _BV(TOIE0); //flaga od wartosci 0 wlaczona
//timer1 init
TCCR1A |= _BV(COM1A1) | _BV(COM1B0) | _BV(COM1B1) | _BV(WGM10);
TCCR1B |= _BV(CS11); //preskaler 8
//timer2 init
TCCR2A |= _BV(COM2A1) | _BV(COM2B0) | _BV(COM2B1) | _BV(WGM20);
TCCR2B |= _BV(CS21); //preskaler 8
//timer3 init
TCCR3A |= _BV(COM3A1) | _BV(COM3B0) | _BV(COM3B1) | _BV(WGM30);
TCCR3B |= _BV(CS31);
TCCR3C |= _BV(COM3A1) | _BV(COM3B0) | _BV(COM3B1) | _BV(WGM33);
TCCR3C |= _BV(CS31);//;|(1 << CS00); //preskaler 8

cbi (TCCR3A, COM3C0);
sbi (TCCR3A, COM3C1);

//timer4 init
TCCR4A |= _BV(COM4A1) | _BV(COM4B0) | _BV(COM4B1) | _BV(WGM40);
TCCR4B |= _BV(CS41);
TCCR4C |= _BV(CS41); //preskaler 8

cbi (TCCR4A, COM4C0);
sbi (TCCR4A, COM4C1);

//timer5 init
TCCR5A |= _BV(COM5A1) | _BV(COM5B0) | _BV(COM5B1) | _BV(WGM50);
TCCR5B |= _BV(CS51); //preskaler 8
TCCR5C |= _BV(CS51);

cbi (TCCR5A, COM5C0);
sbi (TCCR5A, COM5C1);

//zerowanie wartosci licznik๓w
TCNT0 = 0;
TCNT1L = 0;
TCNT2 = 0;

TCNT3 = 0;
TCNT4L = 0;
TCNT5 = 0;

sei(); //zezwolenie na obsloge przerwan
}
void io_init()
{
pinMode(6, OUTPUT); //OC0A
pinMode(5, OUTPUT); //OC0B
pinMode(9, OUTPUT); //OC1A
pinMode(10, OUTPUT);//OC1B
pinMode(11, OUTPUT);//OC2A
pinMode(3, OUTPUT); //OC3C
pinMode(52, INPUT);
pinMode(53, INPUT);
pinMode(50, OUTPUT);

pinMode(2, OUTPUT); //OC3B
pinMode(4, OUTPUT); //OC0B
pinMode(7, OUTPUT); //OC1A
pinMode(8, OUTPUT);//OC4C
pinMode(12, OUTPUT);//OC2A
pinMode(13, OUTPUT); //OC2B

pinMode(44, OUTPUT);//OC4C
pinMode(45, OUTPUT);//OC2A
pinMode(46, OUTPUT); //OC2B

pinMode(A3, INPUT); //OC1A
pinMode(A4, OUTPUT);//OC1B
pinMode(A5, OUTPUT);//OC2A
pinMode(A6, OUTPUT); //OC3C
pinMode(A1, OUTPUT);
pinMode(A0, OUTPUT);
pinMode(A9, OUTPUT);

pinMode(A10, OUTPUT); //OC0A
pinMode(A11, OUTPUT); //OC0B
pinMode(A12, OUTPUT); //OC1A
pinMode(A13, OUTPUT);//OC4C
pinMode(A14, OUTPUT);//OC2A
pinMode(A15, OUTPUT); //OC2B
}
ISR(TIMER0_OVF_vect) //przerwanie przy wartosci 0 licznika0
{
analog = ADC;
if(a)
{
U_in = 0.0709*analog;
ADMUX |= _BV(MUX0); //wybranie wejscia ADC1 do pomiaru pradu
}
else
{
ADMUX |= ADMUX &= 0b11110000; //wybranie wejscia ADC0 do pomiaru napiecia
if(analog>579)
{
blad = 0; //jezeli przeciazenie wylaczenie generacji napiecia
digitalWrite(50, HIGH); //zapalenie diody
}
}
ADCSRA |= _BV(ADSC);//start odczytywania pomiaru
a=a^1; //bramka XOR neguje wartosc logiczna a
licznik_glowny++;
if(licznik_glowny>=dlugosc_tab_sin) licznik_glowny = 0;
}
void zmien_predkosc()
{

t_param = map(analogRead(3),0,1023,0,100);
U_rms_max = U_in*0.62;
bool up;
bool down;
up = digitalRead(52);
down = digitalRead(53);
if(up==1) t_param--;
if(down==1) t_param++;
if(t_param<0) t_param=0;
if(t_param>100) t_param=100;//^
dlugosc_tab_sin = ceil((K_MAX-K_MIN)*t_param/500+K_MIN);//ilosc wartosci wypelnien w jednym okresie
t_out = T_PWM*dlugosc_tab_sin; //obliczenie okresu napiecia wyjsciowego
omega_t = t*2*PI/t_out; //obliczenie pulsacji napiecia wyjsciowego
U_o_param = (P/t_out)/U_rms_max; //obliczenie parametru okreslajacego wielkosc napiecia wyjsciowego
if(t_out>1) U_o_param = 0.5*(18.5/U_rms_max); //napi๊cie na wyjsciu przy niskiej czestotliwosci 10V
if(U_o_param>1) U_o_param=1;
//zabezpieczenie przekroczenia wartosci skrajnych
blad = 1; //jezeli przeciazenie wylaczenie generacji napiecia
digitalWrite(50, LOW); //zapalenie diody
}

mag155
Offline
Зарегистрирован: 21.12.2017

Есть вот такой код вполне рабочий. Но для полного счастья нужно реализовать deadtime подскажите как это сделать?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

А что у Вас в строке 55 и 68?

mag155
Offline
Зарегистрирован: 21.12.2017

Вы имеете в виду это ocr0a - 1. Единицы мало а если делаю больше генерация получается кривая ?

b707
Offline
Зарегистрирован: 26.05.2017

mag155 пишет:
Вы имеете в виду это ocr0a - 1. Единицы мало а если делаю больше генерация получается кривая ?

нет, мне кажется он намекает на то, что вы за год на форуме даже код не научились правильно выкладывать

mag155
Offline
Зарегистрирован: 21.12.2017

С телефона выложил.А там по другому никак .

mag155
Offline
Зарегистрирован: 21.12.2017

По теме есть что сказать ?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

mag155 пишет:
С телефона выложил.А там по другому никак .
Не надо сюда с телефона выкладывать.

Никогда.

mag155
Offline
Зарегистрирован: 21.12.2017
#include "arduino.h" //Store data in flash (program) memory instead of SRAM
#include "avr/pgmspace.h"
#include "avr/io.h"
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define UN (400.0)
#define FN (50.0)
#define P (UN/FN)
#define T_PWM (0.000255)
#define T_MAX (4.0)
#define T_MIN (0.02)
#define K_MAX floor(T_MAX/T_PWM)
#define K_MIN ceil(T_MIN/T_PWM)
volatile static unsigned int dlugosc_tab_sin; //okresie napiecia wyjsciowego
static unsigned int i = 0;
volatile static unsigned int licznik_glowny = 0;

static unsigned int next_value_sin = 0;
static double t_param=100;
static float t = T_PWM;
static float omega_t;
static float t_out;
static float U_o_param;

static unsigned int ocr0a, ocr0b, ocr1a;
static unsigned int ocr1b, ocr2a, ocr2b;
static unsigned int ocr3a, ocr3b, ocr3c;
static unsigned int ocr4a, ocr4b, ocr4c;//^
static unsigned int ocr5a, ocr5b, ocr5c;//
static double sin_in;
static double blad = 1;
static unsigned int analog=0;
static double U_in = 0;
static double U_rms_max;
static bool a=0;
int main()
{
io_init();
timers_init(); //inicjalizacja licznikow PWM
adc_init(); //inicjalizacja przetwornika ADC
while(1) //nieskonczona petla z programem glownym
{
if(i==185) //warunek okreslajacy wejscie do funkcji zmiany
{ //parametrow napiecia wysjciowego, wywolanie co okolo 100ms
zmien_predkosc(); //funkcja zmiany parametrow napiecia wyjsciowego
i=0;
}
next_value_sin = licznik_glowny%dlugosc_tab_sin; //kolejna wartoœๆ sinusa do obliczenia
sin_in=omega_t*next_value_sin;

//obliczenie wartosci do rejestrow okreslajacych wypelnienie sygnalu wyjscioweg/
ocr0a = round(blad*(U_o_param*(sin(sin_in)+1)*254/2)+1);//pin D 13
ocr0b = ocr0a - 1;//pin D 4
ocr1a = round(blad*(U_o_param*(sin(sin_in-2.09)+1)*254/2)+1);//pin D 11
ocr1b = ocr1a - 1;//pin D 12
ocr2a = round(blad*(U_o_param*(sin(sin_in+2.09)+1)*254/2)+1);//pin D 10
ocr2b = ocr2a - 1;//pin D 9

ocr3a = round(blad*(U_o_param*(sin(sin_in)+1)*254/2)+1);//pin D 5
ocr3b = ocr3a-1;//r3a-1;//ocr3a - 1;//pin D 2
ocr4a = round(blad*(U_o_param*(sin(sin_in-2.09)+1)*254/2)+1);//pin D 6
ocr4b = ocr4a-1;//ocr3c-1;//ocr3c - 1;//pin D 7
ocr5a = round(blad*(U_o_param*(sin(sin_in+2.09)+1)*254/2)+1);//pin D 46
ocr5b = ocr5a-1;//ocr4a -1; //pin D 45

ocr3c = ocr0b;//round(blad*(U_o_param*(sin(sin_in)+1)*254/2)+1);//pin D 3
ocr4c = ocr1b;//round(blad*(U_o_param*(sin(sin_in+2.09)+1)*254/2)+1);//pin D 8
ocr5c = ocr2b;//round(blad*(U_o_param*(sin(sin_in-2.09)+1)*254/2)+1);//pin D 44

//uaktualnienie wartosci w rejestrach/
cli(); //zabronienie na obsloge przerwan na wypadek gdyby
//podczas uaktualniania wystapilo przerwanie
OCR0A = ocr0a; //pin D13
OCR0B = ocr0b; //pin D4
OCR1A = ocr1a; //pin D11
OCR1B = ocr1b; //pin D12
OCR2A = ocr2a; //pin D10
OCR2B = ocr2b; //pin D9

OCR3A = ocr3a; //pin D5
OCR3B = ocr3b; //pin D2
OCR3C = ocr3c; //pin D3
OCR4A = ocr4a; //pin D6
OCR4B = ocr4b; //pin D7
OCR4C = ocr4c; //pin D8

OCR5A = ocr5a; //pin D46
OCR5B = ocr5b; //pin D45
OCR5C = ocr5c; //pin D44

sei(); //zezwolenie na obsloge przerwan
i++;
}
}
void adc_init()
{
ADCSRA |= _BV(ADEN);//uruchomienie przetwornika
ADCSRA |= _BV(ADPS2);//ustawienie preskalera
ADCSRA |= _BV(ADPS1);//^
ADCSRA |= _BV(ADPS0);//^
ADMUX |= _BV(REFS0);// napiecie odniesienia ustawione jako napiecie zasilania
ADMUX |= ADMUX &= 0b11110000; //wybranie wejscia ADC0 do pomiaru
}
void timers_init()
{
cli(); // obsloga przerwan zabroniona
TCCR0A |= _BV(COM0A1) | _BV(COM0B0) | _BV(COM0B1) | _BV(WGM00);
TCCR0B |= _BV(CS01); //preskaler 8
TIMSK0 |= _BV(TOIE0); //flaga od wartosci 0 wlaczona
//timer1 init
TCCR1A |= _BV(COM1A1) | _BV(COM1B0) | _BV(COM1B1) | _BV(WGM10);
TCCR1B |= _BV(CS11); //preskaler 8
//timer2 init
TCCR2A |= _BV(COM2A1) | _BV(COM2B0) | _BV(COM2B1) | _BV(WGM20);
TCCR2B |= _BV(CS21); //preskaler 8
//timer3 init
TCCR3A |= _BV(COM3A1) | _BV(COM3B0) | _BV(COM3B1) | _BV(WGM30);
TCCR3B |= _BV(CS31);
TCCR3C |= _BV(COM3A1) | _BV(COM3B0) | _BV(COM3B1) | _BV(WGM33);
TCCR3C |= _BV(CS31);//;|(1 << CS00); //preskaler 8

cbi (TCCR3A, COM3C0);
sbi (TCCR3A, COM3C1);

//timer4 init
TCCR4A |= _BV(COM4A1) | _BV(COM4B0) | _BV(COM4B1) | _BV(WGM40);
TCCR4B |= _BV(CS41);
TCCR4C |= _BV(CS41); //preskaler 8

cbi (TCCR4A, COM4C0);
sbi (TCCR4A, COM4C1);

//timer5 init
TCCR5A |= _BV(COM5A1) | _BV(COM5B0) | _BV(COM5B1) | _BV(WGM50);
TCCR5B |= _BV(CS51); //preskaler 8
TCCR5C |= _BV(CS51);

cbi (TCCR5A, COM5C0);
sbi (TCCR5A, COM5C1);

//zerowanie wartosci licznik๓w
TCNT0 = 0;
TCNT1L = 0;
TCNT2 = 0;

TCNT3 = 0;
TCNT4L = 0;
TCNT5 = 0;

sei(); //zezwolenie na obsloge przerwan
}
void io_init()
{
pinMode(6, OUTPUT); //OC0A
pinMode(5, OUTPUT); //OC0B
pinMode(9, OUTPUT); //OC1A
pinMode(10, OUTPUT);//OC1B
pinMode(11, OUTPUT);//OC2A
pinMode(3, OUTPUT); //OC3C
pinMode(52, INPUT);
pinMode(53, INPUT);
pinMode(50, OUTPUT);

pinMode(2, OUTPUT); //OC3B
pinMode(4, OUTPUT); //OC0B
pinMode(7, OUTPUT); //OC1A
pinMode(8, OUTPUT);//OC4C
pinMode(12, OUTPUT);//OC2A
pinMode(13, OUTPUT); //OC2B

pinMode(44, OUTPUT);//OC4C
pinMode(45, OUTPUT);//OC2A
pinMode(46, OUTPUT); //OC2B

pinMode(A3, INPUT); //OC1A
pinMode(A4, OUTPUT);//OC1B
pinMode(A5, OUTPUT);//OC2A
pinMode(A6, OUTPUT); //OC3C
pinMode(A1, OUTPUT);
pinMode(A0, OUTPUT);
pinMode(A9, OUTPUT);

pinMode(A10, OUTPUT); //OC0A
pinMode(A11, OUTPUT); //OC0B
pinMode(A12, OUTPUT); //OC1A
pinMode(A13, OUTPUT);//OC4C
pinMode(A14, OUTPUT);//OC2A
pinMode(A15, OUTPUT); //OC2B
}
ISR(TIMER0_OVF_vect) //przerwanie przy wartosci 0 licznika0
{
analog = ADC;
if(a)
{
U_in = 0.0709*analog;
ADMUX |= _BV(MUX0); //wybranie wejscia ADC1 do pomiaru pradu
}
else
{
ADMUX |= ADMUX &= 0b11110000; //wybranie wejscia ADC0 do pomiaru napiecia
if(analog>579)
{
blad = 0; //jezeli przeciazenie wylaczenie generacji napiecia
digitalWrite(50, HIGH); //zapalenie diody
}
}
ADCSRA |= _BV(ADSC);//start odczytywania pomiaru
a=a^1; //bramka XOR neguje wartosc logiczna a
licznik_glowny++;
if(licznik_glowny>=dlugosc_tab_sin) licznik_glowny = 0;
}
void zmien_predkosc()
{

t_param = map(analogRead(3),0,1023,0,100);
U_rms_max = U_in*0.62;
bool up;
bool down;
up = digitalRead(52);
down = digitalRead(53);
if(up==1) t_param--;
if(down==1) t_param++;
if(t_param<0) t_param=0;
if(t_param>100) t_param=100;//^
dlugosc_tab_sin = ceil((K_MAX-K_MIN)*t_param/500+K_MIN);//ilosc wartosci wypelnien w jednym okresie
t_out = T_PWM*dlugosc_tab_sin; //obliczenie okresu napiecia wyjsciowego
omega_t = t*2*PI/t_out; //obliczenie pulsacji napiecia wyjsciowego
U_o_param = (P/t_out)/U_rms_max; //obliczenie parametru okreslajacego wielkosc napiecia wyjsciowego
if(t_out>1) U_o_param = 0.5*(18.5/U_rms_max); //napi๊cie na wyjsciu przy niskiej czestotliwosci 10V
if(U_o_param>1) U_o_param=1;
//zabezpieczenie przekroczenia wartosci skrajnych
blad = 1; //jezeli przeciazenie wylaczenie generacji napiecia
digitalWrite(50, LOW); //zapalenie diody
}

Каюсь во грехе сем.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ТС! Даже если ты выложишь этот код верно, вот так вот, с польскими комментариями, то ты правда веришь, что кто-то будет изучать, как туда добавить дед тайм? ;))))

Причем код для АВР в ветке про СТМ32 ;))))

------

Я в твои дела не лезу, но я бы диллера сменил, он тебе белый точно чем-то бодяжит, ИМХО. ;))))

b707
Offline
Зарегистрирован: 26.05.2017

mag155 пишет:
По теме есть что сказать ?

вам? бессмысленно

Сколько у вас разных тупых тем тут было? - про трехфазный диммер, про ускорение работы Дуе, про освоение СТМ32... Хоть что-нибудь получилось?? - НИЧЕГО

И с этими дидтаймами все будет так же.

mag155
Offline
Зарегистрирован: 21.12.2017

Диммер прекрасно работает. Но этож тупая тема.

b707
Offline
Зарегистрирован: 26.05.2017

wdrakula пишет:

Причем код для АВР в ветке про СТМ32 ;))))

да, точно.

МАГ155 - шли бы вы куда подальше из этой ветки, а то вы ее вконец засрете. У вас тяга писать в чужие ветки и забивать их тупыми сообщениями на много страниц...

bwn - может потереть отсюда этот вопрос и все ответы как оффтоп для СТМ32?

b707
Offline
Зарегистрирован: 26.05.2017

mag155 пишет:
Диммер прекрасно работает.

ну да, ну да. Микрософт слышал? - моя работа

mag155
Offline
Зарегистрирован: 21.12.2017

Если бы вы меньше срали тупыми ответами былобы куда меньше страниц в теме .

mag155
Offline
Зарегистрирован: 21.12.2017

Поясните что значит без разницы в чем писать ? Даташид для stm32 заточен под CMSIS как тогда использовать его с помощью arduino .Или я что то не так понимаю?

nik182
Offline
Зарегистрирован: 04.05.2015

Можно писать с помощью CMSYS. Ардуина нормально его кушает. 

mag155
Offline
Зарегистрирован: 21.12.2017

Вы имеете ввиду CMSIS?

mag155
Offline
Зарегистрирован: 21.12.2017

Шутить изволите ?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

mag155 пишет:
Даташид для stm32 заточен под CMSIS
Это как?

nik182
Offline
Зарегистрирован: 04.05.2015

Посмотрите програму Димы. Чесный CMSIS. Отлично работает. http://arduino.ru/forum/proekty/generator-s-reguliruemoei-chastotoi-na-arduino#comment-296530

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

nik182, там LibMaple, но это можно назвать аналогом CMSIS + надстройка , аналогичная  HAL. Поэтому можно какие-то дюже муторные вещи вроде клоков конфигурировать функциями. А вот addon  от STM работает как раз на чистом CMSIS и HAL. Так что мигрировать с одного на другое можно относительно безболезненно :)

mag155
Offline
Зарегистрирован: 21.12.2017

Дак как все же работать с stm32 через ардуино чтоб настроить таймеры ???