First draft of firmware v2.0.0
- Re-wired for rev.2.0.0 board pinout - Added functions for follower/comparator adjustment via PWM - Re-tasked resistor ladder to gain factor adjustment - Migrated calculations to interger (away from floats)
This commit is contained in:
parent
7fd60d1d74
commit
055ab3c09e
1 changed files with 268 additions and 0 deletions
|
|
@ -0,0 +1,268 @@
|
|||
/*
|
||||
Piezoelectric Z-Axis sensor using AtMega88/168/328 (AtMega 48 doesnt have enough memory for this version)
|
||||
|
||||
This sketch reads a piezo element to detect a touch of the printer's nozzle to the bed.
|
||||
The sense pin is tied to an interrupt, which is pulled high by internal pullup resistor.
|
||||
When the piezo touches the bed, the amplification circuit will draw the interrupt pin low
|
||||
and the atmega will output a pulse based on the programmed trigger duration
|
||||
|
||||
* PD2 INT0 (Piezo In 'D2')
|
||||
* D7 PCINT23 (Trigger OUT 'D7')
|
||||
* PC0 ADC0 (Voltage Reference Check 'A0')
|
||||
* PC1 ADC1 (Sensitivity Adjustment Check 'A1')
|
||||
* PD4 PCINT20 (Error feedback LED 'D4')
|
||||
* PB6 PCINT6 (Voltage Adjustment Resistor 0 'D20')
|
||||
* PB7 PCINT7 (Voltage Adjustment Resistor 1 'D21')
|
||||
* PD5 T1 (Voltage Adjustment Resistor 2 'D5')
|
||||
* PD6 PCINT22 (Voltage Adjustment Resistor 3 'D6')
|
||||
* PB1 OC1A (Comparator VRef PWM Out 'D9')
|
||||
* PD3 OC2B (Voltage Follower VRef PWM Out 'D3')
|
||||
|
||||
Schematics for this project can be found here: https://github.com/pyr0ball/pyr0piezo/tree/master/docs/Schematics
|
||||
|
||||
created 2/18/2019
|
||||
by Alan "pyr0ball" Weinstock
|
||||
|
||||
This code is in the public domain.
|
||||
*/
|
||||
|
||||
// Set variables for working parameters
|
||||
int GAIN_FACTOR = 2; // Gain adjustment factor. 0=2x, 1=2.5x, 2=3.33x, 3=5x, 4=10x
|
||||
int InitCount = 6; // Number of times to blink the LED on start
|
||||
int TRG_DUR = 120; // duration of the Z-axis pulse sent, in ms
|
||||
float senseHighThrs = 2.35; // Upper threshold of Voltage Follower before adjustment
|
||||
float senseLowThrs = 1.8; // Lower threshold of Voltage Follower before adjustment
|
||||
float compHighThrs = 2.75; // Upper threshold of Comparator before adjustment
|
||||
float compLowThrs = 2.54; // Lower threshold of Comparator before adjustment
|
||||
int Vin = 5; // input reference voltage
|
||||
|
||||
// Analog Pin Assignments
|
||||
int V_FOLLOW_PIN = A0; // Sense pin to check Voltage Follower stage
|
||||
int VCOMP_SENSE_PIN = A1; // Sense pin to check comparator stage voltage
|
||||
|
||||
// Digital Pin Assignments
|
||||
const int TRG_OUT = 7; // LED and Z-Min trigger output connected to digital pin 7
|
||||
//const int TRG_OUT = 13; // For testing on Atmega328/2560, Output is moved to onboard LED pin
|
||||
//#define Z_TRG 0 // the piezo is connected to INT0 / digital pin 2
|
||||
const byte Z_TRG = 2; // the piezo is connected to INT0 / digital pin 2
|
||||
int ERR_LED = 4; // LED will blink if optimal voltage range cannot be achieved
|
||||
const int GADJ_R0 = 20; // Auto-adjust ladder pin assignments
|
||||
const int GADJ_R1 = 21; // "
|
||||
const int GADJ_R2 = 5; // "
|
||||
const int GADJ_R3 = 6; // "
|
||||
int V_FOL_PWM = 3; // PWM analog output pin for voltage follower adjustment
|
||||
int VCOMP_PWM = 9; // PWM analog output pin for comparator adjustment
|
||||
|
||||
// these variables will change on their own. Do not edit ANYTHING below this line
|
||||
volatile int sensorHReading = 0; // variable to store the value read from the sensor pin
|
||||
volatile int ADJ_FOLLOW = 0; // Variable for Follower adjustment
|
||||
volatile int ADJ_COMP = 0; // Variable for Comparator adjustment
|
||||
volatile int ERR_STATE = 0;
|
||||
|
||||
// Convert float to integer for adjustment functions
|
||||
int senseHighInt = (senseHighThrs / 5) * 1024; // Voltage Follower upper converted to adg interger
|
||||
int senseLowInt = (senseLowThrs / 5) * 1024; // Voltage Follower lower converted to adg interger
|
||||
int compHighInt = (compHighThrs / 5) * 1024; // Upper threshold of Comparator before adjustment
|
||||
int compLowInt = (compLowThrs / 5) * 1024; // Lower threshold of Comparator before adjustment
|
||||
|
||||
// Voltage Comparator Adjustment parameters
|
||||
float VCompRef = 0.00; // variable to store the float value read from the comparator reference
|
||||
int VComp = 0;
|
||||
int diffCompL = VComp - compLowInt;
|
||||
int diffCompH = compHighInt - VComp;
|
||||
|
||||
|
||||
// Voltage Follower Adjustment parameters
|
||||
float vAdjRead = 0.00; // variable to store the value read from the follower
|
||||
int VAdj = 0;
|
||||
int diffAdjL = VAdj - senseLowInt;
|
||||
int diffAdjH = senseHighInt - VAdj;
|
||||
|
||||
// Error blink parameters
|
||||
int BlinkState = LOW;
|
||||
int BlinkCount = InitCount * 2; // Multiply Blink count by 2 to handle toggle state
|
||||
|
||||
void setup() {
|
||||
pinMode(TRG_OUT, OUTPUT); // declare the Trigger as as OUTPUT
|
||||
pinMode(ERR_LED, OUTPUT);
|
||||
pinMode(Z_TRG, INPUT_PULLUP); // declare z-sense input with pullup
|
||||
pinMode(V_FOLLOW_PIN, INPUT);
|
||||
pinMode(VCOMP_SENSE_PIN, INPUT);
|
||||
pinMode(GADJ_R0, INPUT); // declare input to break pull to ground
|
||||
pinMode(GADJ_R1, INPUT); // declare input to break pull to ground
|
||||
pinMode(GADJ_R2, INPUT); // declare input to break pull to ground
|
||||
pinMode(GADJ_R3, INPUT); // declare input to break pull to ground
|
||||
Serial.begin(9600);
|
||||
|
||||
// Uncomment the following lines to use PCInt pins instead of hardware interrupt
|
||||
//#include <PinChangeInterrupt.h>
|
||||
//attachPCINT(digitalPinToPCINT(Z_TRG), pulse, FALLING);
|
||||
|
||||
// Uncomment the followoing line to use hardware interrupt pin
|
||||
attachInterrupt(digitalPinToInterrupt(Z_TRG), pulse, FALLING);
|
||||
|
||||
Serial.println("Initializing Piezo Sensor...");
|
||||
|
||||
}
|
||||
|
||||
/*------------------------------------------------*/
|
||||
|
||||
void pulse() {
|
||||
digitalWrite(TRG_OUT, LOW);
|
||||
sensorHReading = 1;
|
||||
}
|
||||
|
||||
/*------------------------------------------------*/
|
||||
|
||||
void adjustFollow() {
|
||||
/* Compares diffs of threshold vs read value
|
||||
if positive, adjusts the follower to within
|
||||
the range set above*/
|
||||
if (diffAdjL > 0.0) {
|
||||
ADJ_FOLLOW + (diffAdjL / 4);
|
||||
}
|
||||
if (diffAdjH > 0.0) {
|
||||
ADJ_FOLLOW - (diffAdjH / 4);
|
||||
}
|
||||
|
||||
// Analog output (PWM) of duty cycle
|
||||
analogWrite(V_FOL_PWM, ADJ_FOLLOW);
|
||||
|
||||
Serial.print("Follower State:");
|
||||
Serial.println(ADJ_FOLLOW);
|
||||
Serial.println("--------------------");
|
||||
}
|
||||
|
||||
/*------------------------------------------------*/
|
||||
|
||||
void adjustComp() {
|
||||
if (diffCompL > 0.0) {
|
||||
ADJ_COMP + (diffCompL / 4);
|
||||
}
|
||||
|
||||
if (diffCompH > 0.0) {
|
||||
ADJ_COMP - (diffCompH / 4);
|
||||
}
|
||||
|
||||
analogWrite(VCOMP_PWM, ADJ_COMP);
|
||||
|
||||
Serial.print("Comparator State:");
|
||||
Serial.println(ADJ_COMP);
|
||||
Serial.println("--------------------");
|
||||
}
|
||||
|
||||
/*------------------------------------------------*/
|
||||
|
||||
void adjustGain() {
|
||||
|
||||
if (GAIN_FACTOR < 0) {
|
||||
ERR_STATE = 1;
|
||||
}
|
||||
if (GAIN_FACTOR == 0) {
|
||||
pinMode(GADJ_R3, INPUT);
|
||||
pinMode(GADJ_R2, INPUT);
|
||||
pinMode(GADJ_R1, INPUT);
|
||||
pinMode(GADJ_R0, INPUT);
|
||||
ERR_STATE = 0;
|
||||
}
|
||||
if (GAIN_FACTOR > 0) {
|
||||
pinMode(GADJ_R3, OUTPUT);
|
||||
digitalWrite(GADJ_R3, LOW);
|
||||
pinMode(GADJ_R2, INPUT);
|
||||
pinMode(GADJ_R1, INPUT);
|
||||
pinMode(GADJ_R0, INPUT);
|
||||
ERR_STATE = 0;
|
||||
}
|
||||
if (GAIN_FACTOR > 1) {
|
||||
pinMode(GADJ_R2, OUTPUT);
|
||||
digitalWrite(GADJ_R2, LOW);
|
||||
pinMode(GADJ_R1, INPUT);
|
||||
pinMode(GADJ_R0, INPUT);
|
||||
ERR_STATE = 0;
|
||||
}
|
||||
if (GAIN_FACTOR > 2) {
|
||||
pinMode(GADJ_R1, OUTPUT);
|
||||
digitalWrite(GADJ_R1, LOW);
|
||||
pinMode(GADJ_R0, INPUT);
|
||||
ERR_STATE = 0;
|
||||
}
|
||||
if (GAIN_FACTOR > 3) {
|
||||
pinMode(GADJ_R0, OUTPUT);
|
||||
digitalWrite(GADJ_R0, LOW);
|
||||
ERR_STATE = 0;
|
||||
}
|
||||
if (GAIN_FACTOR > 4) {
|
||||
ERR_STATE = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*------------------------------------------------*/
|
||||
|
||||
void checkError () {
|
||||
if (ERR_STATE == 1) {
|
||||
digitalWrite(ERR_LED, BlinkState);
|
||||
BlinkState = !BlinkState;
|
||||
}
|
||||
if (ERR_STATE == 0) {
|
||||
BlinkState = LOW;
|
||||
digitalWrite(ERR_LED, BlinkState);
|
||||
}
|
||||
}
|
||||
|
||||
/*------------------------------------------------*/
|
||||
|
||||
void loop() {
|
||||
|
||||
// Blink LED's on init
|
||||
if (BlinkCount > 0) {
|
||||
BlinkState = !BlinkState;
|
||||
digitalWrite(ERR_LED, BlinkState);
|
||||
digitalWrite(TRG_OUT, BlinkState);
|
||||
delay(150);
|
||||
--BlinkCount;
|
||||
}
|
||||
|
||||
// Check voltage of first and second stages and compare against thresholds
|
||||
|
||||
VComp = analogRead(VCOMP_SENSE_PIN);
|
||||
diffCompL = VComp - compLowInt;
|
||||
diffCompH = compHighInt - VComp;
|
||||
VCompRef = (VComp * 5) / 1024;
|
||||
|
||||
VAdj = analogRead(V_FOLLOW_PIN);
|
||||
diffAdjL = VAdj - senseLowInt;
|
||||
diffAdjH = senseHighInt - VAdj;
|
||||
vAdjRead = (VAdj * 5) / 1024;
|
||||
|
||||
// Set the amplification gain factor
|
||||
adjustGain();
|
||||
|
||||
// Voltage Follower adjustment
|
||||
adjustFollow();
|
||||
|
||||
// Voltage Comparator adjustment
|
||||
adjustComp();
|
||||
|
||||
// Check for error state
|
||||
checkError();
|
||||
|
||||
// Checks state of the interrupt trigger, prints status, then sets output pin low
|
||||
Serial.print("PZ Status:");
|
||||
Serial.println(sensorHReading);
|
||||
Serial.print("Voltage Reference:");
|
||||
Serial.println(VCompRef);
|
||||
Serial.print("Amp Sense:");
|
||||
Serial.println(vAdjRead);
|
||||
Serial.print("Comparator State:");
|
||||
Serial.println(ADJ_COMP);
|
||||
Serial.print("Follower State:");
|
||||
Serial.println(ADJ_FOLLOW);
|
||||
Serial.print("Delay:");
|
||||
Serial.println(TRG_DUR);
|
||||
Serial.print("Error State:");
|
||||
Serial.println(ERR_STATE);
|
||||
Serial.println("------------------");
|
||||
delay(TRG_DUR);
|
||||
digitalWrite(TRG_OUT, HIGH);
|
||||
sensorHReading = 0;
|
||||
}
|
||||
Loading…
Reference in a new issue