Получил ответ от автора видео в посте #9, Владимира Смирнова.
----
схема вся на видео, как таковую не рисовал, все 6 шимов с ардуинки на полумосты
http://www.freepatent.ru/images/patents/73/2389128/2389128.jpg (плюсы фаз (верхнее плече) по порядку 11,9,5 минусы(нижнее плече) 10,6,3) скетч сырой
https://yadi.sk/d/hcSktxO5dIJVtg
----
Скетч
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
long previousMillis = 0; //когда последний раз мигали
long previousGetMillis = 0;
int otkl;
int vih;
int vivodov;
int obr; //временные переменные для вывода
long ps,obmin;
double CurInt,nado ; //Текущий интервал фаз (в градусах)
long previousMillisTakt = 0; //Предыдущее срабатывания счетчика интервала
long interval = 1; //Интервал в миллисекундах (влияет на скорость)
double increment = 1; //шаг увеличения угла
int Phase1,Phase2,Phase3; //Текущее значение уровня фаз
int Phase1u,Phase2u,Phase3u; //Текущее значение уровня фаз
int Phase1d,Phase2d,Phase3d; //Текущее значение уровня фаз
double pi = 3.1415926535; //Можно только гадать что это
int sin_tab [512];
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
//****************************************************************************************************************************
void Takt() //Тут обработка логичесткового калибровоного такта каждый interval
{
//Гоняем интервал фаз от 0 до 360 (если гонять обратно двигатель будет крутиться обратно)
CurInt=CurInt+(nado/50);
if (CurInt >= 255) CurInt = 0;
//Математика расчета фаз
//Phase1 = sin(CurInt*2*pi/180)*127+128; //Фаза 1 должна описывать траекторию синусойды для достижения максимальной мощьности двигателя
//Phase2 = sin((CurInt+120)*2*pi/180)*127+128; //Фаза 2 находится также как и первая со смещением в 120 градусов
//Phase3 = sin((CurInt+240)*2*pi/180)*127+128; //Фаза 3 находится также как и первая со смещением в 240 градусов или со смещением в 120 градусов от второй
Phase1 = sin_tab[long(CurInt)]; //Фаза 1 должна описывать траекторию синусойды для достижения максимальной мощьности двигателя
Phase2 = sin_tab[long(CurInt+85)]; //Фаза 1 должна описывать траекторию синусойды для достижения максимальной мощьности двигателя
Phase3 = sin_tab[long(CurInt+170)]; //Фаза 1 должна описывать траекторию синусойды для достижения максимальной мощьности двигателя
//Записываем
if (Phase1 > 0) {
Phase1u = Phase1;
Phase1d = 0;
} else {
Phase1u = 0;
Phase1d = -Phase1;
}
if (Phase2 > 0) {
Phase2u = Phase2;
Phase2d = 0;
} else {
Phase2u = 0;
Phase2d = -Phase2;
}
if (Phase3 > 0) {
Phase3u = Phase3;
Phase3d = 0;
} else {
Phase3u = 0;
Phase3d = -Phase3;
}
analogWrite(11, Phase1u);
analogWrite(10, Phase1d);
analogWrite(9 , Phase2u);
analogWrite(6 , Phase2d);
analogWrite(5 , Phase3u);
analogWrite(3 , Phase3d);
}
//******************************************************************************************************************
void setup(){
lcd.init(); // initialize the lcd
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("init");
for (double i=0;i<=255;i++) {
sin_tab[int(i)]=sin(i/255*2*pi)*80;
sin_tab[int(i)+255]=sin_tab[int(i)];
};
lcd.setCursor(0, 0);
lcd.print("cur=");
lcd.setCursor(0, 1);
lcd.print("nado =");
pinMode(3, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(7, INPUT);
pinMode(2, INPUT);
attachInterrupt(0,int1,RISING); //и аттачим clock также на D2й вход
}
//******************************************************************************************************************
void int1(){ //Прерывание обработки оборотов
ps++;
}
//******************************************************************************************************************
void loop(){
if(millis()-previousMillisTakt > 2){
previousMillisTakt=millis();
Takt();
};
if(millis()-previousGetMillis > 500){
previousGetMillis=millis();
nado = analogRead(7)/4;
obmin = ps*2;
ps=0;
};
if (millis() - previousMillis > 100) { //мигалка
obr = analogRead(6)/4;
if (obr>=nado) {
otkl=max(otkl--,0);
} else {
otkl=min(otkl++,127);
};
vih = max(min(obr+otkl,127),0);
previousMillis = millis();
vivodov++;
lcd.setCursor(10, 0);
lcd.print(vivodov);
lcd.setCursor(5, 0);
// lcd.print(String("")+nado/51+"."+nado%51*196/100+" ");
lcd.print(String("")+long(CurInt)+" ");
lcd.setCursor(7, 1);
lcd.print(String("")+long(nado)+" ");
}
}
//******************************************************************************************************************
/**
* Divides a given PWM pin frequency by a divisor.
*
* The resulting frequency is equal to the base frequency divided by
* the given divisor:
* - Base frequencies:
* o The base frequency for pins 3, 9, 10, and 11 is 31250 Hz.
* o The base frequency for pins 5 and 6 is 62500 Hz.
* - Divisors:
* o The divisors available on pins 5, 6, 9 and 10 are: 1, 8, 64,
* 256, and 1024.
* o The divisors available on pins 3 and 11 are: 1, 8, 32, 64,
* 128, 256, and 1024.
*
* PWM frequencies are tied together in pairs of pins. If one in a
* pair is changed, the other is also changed to match:
* - Pins 5 and 6 are paired on timer0
* - Pins 9 and 10 are paired on timer1
* - Pins 3 and 11 are paired on timer2
*
* Note that this function will have side effects on anything else
* that uses timers:
* - Changes on pins 3, 5, 6, or 11 may cause the delay() and
* millis() functions to stop working. Other timing-related
* functions may also be affected.
* - Changes on pins 9 or 10 will cause the Servo library to function
* incorrectly.
*
* Thanks to macegr of the Arduino forums for his documentation of the
* PWM frequency divisors. His post can be viewed at:
*
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1235060559/0#4
*/
void setPwmFrequency(int pin, int divisor) {
byte mode;
if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
switch(divisor) {
case 1:
mode = 0x01;
break;
case 8:
mode = 0x02;
break;
case 64:
mode = 0x03;
break;
case 256:
mode = 0x04;
break;
case 1024:
mode = 0x05;
break;
default:
return;
}
if(pin == 5 || pin == 6) {
TCCR0B = TCCR0B & 0b11111000 | mode;
}
else {
TCCR1B = TCCR1B & 0b11111000 | mode;
}
}
else if(pin == 3 || pin == 11) {
switch(divisor) {
case 1:
mode = 0x01;
break;
case 8:
mode = 0x02;
break;
case 32:
mode = 0x03;
break;
case 64:
mode = 0x04;
break;
case 128:
mode = 0x05;
break;
case 256:
mode = 0x06;
break;
case 1024:
mode = 0x7;
break;
default:
return;
}
TCCR2B = TCCR2B & 0b11111000 | mode;
}
}