//#include <TimeInterrupt.h>
#include "PinChangeInterrupt.h"
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
// 0X3C+SA0 - 0x3C or 0x3D
#define I2C_ADDRESS 0x3C
// Define proper RST_PIN if required.
#define RST_PIN -1
#define Output1 11
#define Out12 A0
#define Output2 10
#define Out22 A2
#define Output3 9
#define Out32 A1
#define rst 7
#define TFT_DC 8
#define TFT_CS 12
#define EncButtonPin 2
#define Encoder2Pin 5
#define Encoder1Pin 4
#define Status1 6
#define Status2 7
int potVal = 0;
uint16_t degreeCounter = 0;
uint8_t changeButton = 0;
int8_t motorPH = 0;
bool setButton = false;
unsigned long lastTimeus = 0;
const uint8_t sinus[] =
{
130,132,134,136,139,141,143,145,147,150,152,154,156,158,160,163,165,167
,169,171,173,175,177,179,181,183,185,187,189,191,193,195,197,199,200,202
,204,206,207,209,211,212,214,216,217,219,220,222,223,225,226,228,229,230
,232,233,234,235,236,237,239,240,241,242,243,244,244,245,246,247,248,248
,249,250,250,251,251,252,252,253,253,253,254,254,254,254,254,254,254,254
,254,254,254,254,254,254,254,253,253,253,252,252,251,251,250,250,249,248
,248,247,246,245,244,244,243,242,241,240,239,237,236,235,234,233,232,230
,229,228,226,225,223,222,220,219,217,216,214,212,211,209,207,206,204,202
,200,199,197,195,193,191,189,187,185,183,181,179,177,175,173,171,169,167
,165,163,160,158,156,154,152,150,147,145,143,141,139,136,134,132,130,128
,125,123,121,119,116,114,112,110,108,105,103,101,99,97,95,93,90,88,86,84
,82,80,78,76,74,72,70,68,66,64,62,60,58,56,55,53,51,49,48,46,44,43,41,39
,38,36,35,33,32,30,29,27,26,25,23,22,21,20,19,18,16,15,14,13,12,11,11,10
,9,8,7,7,6,5,5,4,4,3,3,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3,4,4
,5,5,6,7,7,8,9,10,11,11,12,13,14,15,16,18,19,20,21,22,23,25,26,27,29,30
,32,33,35,36,38,39,41,43,44,46,48,49,51,53,55,56,58,60,62,64,66,68,70,72
,74,76,78,80,82,84,86,88,90,92,95,97,99,101,103,105,108,110,112,114,116
,119,121,123,125,127
};
struct EncoderData
{
int8_t oldPos;
uint32_t encoderPosition;
bool encSignalChanged;
};
SSD1306AsciiWire oled;
EncoderData encoder_Data;
void ISRButton()
{
if(!digitalRead(EncButtonPin))
{
changeButton++;
if(changeButton > 3)
changeButton = 0;
digitalWrite(Status1,changeButton&0x01);
digitalWrite(Status2,changeButton&0x02);
setButton = true;
encoder_Data.encoderPosition = 512;
}
}
void MotorStep(int st)
{
/* Vezérlő:
IN L-L = Z OUT
IN H-H = L OUT
IN H-L = H OUT
*/
switch(st)
{
case 0: //A = OFF (Z) ; B=H ; C= L
{
analogWrite(Output1, 0);// A = Z
digitalWrite(Out12,0); //
analogWrite(Output2, 255);// B=H
digitalWrite(Out22,0);
analogWrite(Output3, 255);// C= L
digitalWrite(Out32,1);
}
case 1: //A = L ; B=H ; C= OFF
{
analogWrite(Output1, 255);// A = L
digitalWrite(Out12,1); //
analogWrite(Output2, 255);// B=H
digitalWrite(Out22,0);
analogWrite(Output3, 0);// C= Z
digitalWrite(Out32,0);
}
case 2: //A = L ; B=OFF ; C= H
{
analogWrite(Output1, 255);// A = L
digitalWrite(Out12,1); //
analogWrite(Output2, 0);// B=Z
digitalWrite(Out22,0);
analogWrite(Output3, 255);// C= H
digitalWrite(Out32,0);
}
case 3: //A = OFF ; B=L ; C= H
{
analogWrite(Output1, 0);// A = Z
digitalWrite(Out12,0); //
analogWrite(Output2, 255);// B=L
digitalWrite(Out22,1);
analogWrite(Output3, 255);// C= H
digitalWrite(Out32,0);
}
case 4: //A = H ; B=L ; C= OFF
{
analogWrite(Output1, 255);// A = Z
digitalWrite(Out12,0); //
analogWrite(Output2, 255);// B=L
digitalWrite(Out22,1);
analogWrite(Output3, 0);// C= H
digitalWrite(Out32,0);
}
case 5: //A = H ; B=OFF; C= L
{
analogWrite(Output1, 255);// A = Z
digitalWrite(Out12,0); //
analogWrite(Output2, 0);// B=L
digitalWrite(Out22,0);
analogWrite(Output3, 255);// C= H
digitalWrite(Out32,0);
}
}
}
int8_t encPosition()
{
int8_t encPos = digitalRead(Encoder1Pin);
encPos = (encPos<<1)|digitalRead(Encoder2Pin);
return encPos;
}
void ISREncoderSignal()
{
int position = 0;
int8_t encPos = encPosition();
switch(encoder_Data.oldPos)
{
case 0:
{
if(encPos == 1)
position--;
else
if(encPos == 2)
position++;
break;
}
case 1:
{
if(encPos == 3)
position--;
else
if(encPos == 0)
position++;
break;
}
case 2:
{
if(encPos == 0)
position--;
else
if(encPos == 3)
position++;
break;
}
case 3:
{
if(encPos == 2)
position--;
else
if(encPos == 1)
position++;
break;
}
}
encoder_Data.oldPos = encPos;
encoder_Data.encSignalChanged = true;
encoder_Data.encoderPosition+=position;
if( encoder_Data.encoderPosition <1)
encoder_Data.encoderPosition =1;
}
void PhasisStaticDrive(uint16_t degree, uint16_t degreeShift )
{
if(degree> 359)
degree = 0;
analogWrite(Output1, sinus[degree]);
degree += degreeShift;
if(degree> 359)
degree -= 360;
analogWrite(Output2, sinus[degree]);
degree += degreeShift;
if(degree> 359)
degree -= 360;
analogWrite(Output3, sinus[degree]);
}
void setup()
{
Serial.begin(9600);
Wire.begin();
Wire.setClock(400000L);
#if RST_PIN >= 0
oled.begin(&Adafruit128x32, I2C_ADDRESS, RST_PIN);
#else // RST_PIN >= 0
oled.begin(&Adafruit128x64, I2C_ADDRESS);
#endif // RST_PIN >= 0
pinMode(Output1, OUTPUT);
pinMode(Output2, OUTPUT);
pinMode(Output3, OUTPUT);
pinMode(Status1, OUTPUT);
pinMode(Status2, OUTPUT);
pinMode(Out12, OUTPUT);
pinMode(Out22, OUTPUT);
pinMode(Out32, OUTPUT);
// pinMode(Freq_IN, INPUT);
pinMode(Encoder1Pin, INPUT_PULLUP);
pinMode(Encoder2Pin, INPUT_PULLUP);
pinMode(EncButtonPin, INPUT_PULLUP);
// Set the main system clock to 8 MHz.
noInterrupts();
// CLKPR = _BV(CLKPCE); // enable change of the clock prescaler
// CLKPR = _BV(CLKPS0); // divide frequency by 2
//------------------ Set PWM frequency for D9 & D10 ------------------------------
TCCR1B = TCCR1B & B11111000 | B00000001; // set timer 1 divisor to 1 for PWM frequency of 31372.55 Hz
//------------------ Set PWM frequency for D3 & D11 ------------------------------
TCCR2B = TCCR2B & B11111000 | B00000001; // set timer 2 divisor to 1 for PWM frequency of 31372.55 Hz
interrupts();
attachInterrupt(digitalPinToInterrupt(EncButtonPin), ISRButton, CHANGE);
attachPCINT(digitalPinToPCINT(Encoder1Pin), ISREncoderSignal,CHANGE );
attachPCINT(digitalPinToPCINT(Encoder2Pin), ISREncoderSignal,CHANGE );
//Wire.begin();
//Wire.setClock(400000L);
oled.setFont(TimesNewRoman16);
oled.clear();
// oled.setLetterSpacing(2);
// oled.set2X();
oled.setCursor(0, 2);
oled.println("Step phasys 60");
encoder_Data.encoderPosition = 512;
}
void loop()
{
switch(changeButton)
{
case 0:
{
if(encoder_Data.encoderPosition > 23 )
encoder_Data.encoderPosition = 0;
MotorStep(encoder_Data.encoderPosition/4);
if(setButton)
{
setButton = false;
oled.clear();
oled.setLetterSpacing(2);
oled.setCursor(2, 3);
oled.println("Step phasys 60");
oled.println(encoder_Data.encoderPosition );
}
break;
}
case 1:
{
if (micros() - lastTimeus >= encoder_Data.encoderPosition*60)
{
if(setButton)
{
setButton = false;
oled.clear();
oled.setLetterSpacing(1);
oled.setCursor(12, 3);
oled.println("Auto step ");
oled.println(encoder_Data.encoderPosition );
}
motorPH++;
if(motorPH>5)
motorPH = 0;
MotorStep(motorPH);
lastTimeus = micros();
}
break;
}
case 2:
{
if(setButton)
{
setButton = false;
oled.clear();
oled.setLetterSpacing(2);
oled.setCursor(12, 3);
oled.println(" SinusPWM step ");
oled.println(encoder_Data.encoderPosition );
}
if( encoder_Data.encoderPosition > 359)
encoder_Data.encoderPosition = 0;
PhasisStaticDrive(encoder_Data.encoderPosition,120);
break;
}
case 3:
{
if (micros() - lastTimeus >= encoder_Data.encoderPosition )
{
if(setButton)
{
setButton = false;
oled.clear();
oled.setLetterSpacing(2);
oled.setCursor(12, 3);
oled.println("Auto SinusPWM ");
oled.println(degreeCounter);
}
if(degreeCounter> 359)
degreeCounter = 0;
PhasisStaticDrive(degreeCounter,120);
lastTimeus = micros();
}
break;
}
}
}
//-------www<electronics-project-hub>com--------//