Shutter module tested

This commit is contained in:
eddyem 2015-02-04 18:49:15 +03:00
parent f600aa9e8e
commit 37b7d5cb16
14 changed files with 184 additions and 88 deletions

View File

@ -1,4 +1,4 @@
Cmp-Mod V01 Created by CvPcb (2013-feb-26)-stable date = Вс 30 ноя 2014 15:38:41 Cmp-Mod V01 Created by CvPcb (2013-feb-26)-stable date = Ср 04 фев 2015 15:00:52
BeginCmp BeginCmp
TimeStamp = /53A910B8/50AF1E60; TimeStamp = /53A910B8/50AF1E60;
@ -115,14 +115,14 @@ EndCmp
BeginCmp BeginCmp
TimeStamp = /53973803/53997111; TimeStamp = /53973803/53997111;
Reference = C5; Reference = C5;
ValeurCmp = 10u; ValeurCmp = 100u;
IdModule = CP_5x11mm; IdModule = CP_5x11mm;
EndCmp EndCmp
BeginCmp BeginCmp
TimeStamp = /53973803/53997130; TimeStamp = /53973803/53997130;
Reference = C6; Reference = C6;
ValeurCmp = 100u; ValeurCmp = 470u;
IdModule = CP_5x11mm; IdModule = CP_5x11mm;
EndCmp EndCmp
@ -217,6 +217,13 @@ ValeurCmp = 1u;
IdModule = SM0805; IdModule = SM0805;
EndCmp EndCmp
BeginCmp
TimeStamp = /54D32A5B;
Reference = C20;
ValeurCmp = 2200u, 40V;
IdModule = CP_16x25mm;
EndCmp
BeginCmp BeginCmp
TimeStamp = /53973803/53976CAB/53BE6988; TimeStamp = /53973803/53976CAB/53BE6988;
Reference = CON1; Reference = CON1;

View File

@ -1,7 +1,7 @@
(export (version D) (export (version D)
(design (design
(source /home/eddy/Docs/SAO/ELECTRONICS/STM32/kicad/alltogether/ALL.sch) (source /home/eddy/Docs/SAO/ELECTRONICS/STM32/kicad/alltogether/ALL.sch)
(date "Вс 30 ноя 2014 15:38:48") (date "Ср 04 фев 2015 15:06:52")
(tool "eeschema (2013-feb-26)-stable")) (tool "eeschema (2013-feb-26)-stable"))
(components (components
(comp (ref XP2) (comp (ref XP2)
@ -219,13 +219,13 @@
(sheetpath (names "/STM32F103 module/") (tstamps /53973803/)) (sheetpath (names "/STM32F103 module/") (tstamps /53973803/))
(tstamp 53996A85)) (tstamp 53996A85))
(comp (ref C5) (comp (ref C5)
(value 10u) (value 100u)
(footprint C2) (footprint C2)
(libsource (lib device) (part C)) (libsource (lib device) (part C))
(sheetpath (names "/STM32F103 module/") (tstamps /53973803/)) (sheetpath (names "/STM32F103 module/") (tstamps /53973803/))
(tstamp 53997111)) (tstamp 53997111))
(comp (ref C6) (comp (ref C6)
(value 100u) (value 470u)
(footprint C2) (footprint C2)
(libsource (lib device) (part C)) (libsource (lib device) (part C))
(sheetpath (names "/STM32F103 module/") (tstamps /53973803/)) (sheetpath (names "/STM32F103 module/") (tstamps /53973803/))
@ -1445,10 +1445,10 @@
(uri /usr/share/kicad/library/conn.lib)) (uri /usr/share/kicad/library/conn.lib))
(library (logical regul) (library (logical regul)
(uri /usr/share/kicad/library/regul.lib)) (uri /usr/share/kicad/library/regul.lib))
(library (logical STM32f103)
(uri /home/eddy/kicad/STM32f103.lib))
(library (logical my_elements) (library (logical my_elements)
(uri my_elements.lib))) (uri my_elements.lib))
(library (logical STM32f103)
(uri /home/eddy/kicad/STM32f103.lib)))
(nets (nets
(net (code 1) (name "/Power MOSFET module 2/GND_OUT") (net (code 1) (name "/Power MOSFET module 2/GND_OUT")
(node (ref XP7) (pin 19)) (node (ref XP7) (pin 19))

View File

@ -1,4 +1,4 @@
EESchema Schematic File Version 2 date Ср 28 янв 2015 08:47:22 EESchema Schematic File Version 2 date Ср 04 фев 2015 15:06:53
LIBS:power LIBS:power
LIBS:device LIBS:device
LIBS:transistors LIBS:transistors
@ -41,7 +41,7 @@ $Descr A3 16535 11693
encoding utf-8 encoding utf-8
Sheet 1 12 Sheet 1 12
Title "IR-spectrometer Control System" Title "IR-spectrometer Control System"
Date "28 jan 2015" Date "4 feb 2015"
Rev "" Rev ""
Comp "SAO RAS" Comp "SAO RAS"
Comment1 "" Comment1 ""

View File

@ -1,4 +1,4 @@
EESchema Schematic File Version 2 date Ср 28 янв 2015 08:47:22 EESchema Schematic File Version 2 date Ср 04 фев 2015 15:06:53
LIBS:power LIBS:power
LIBS:device LIBS:device
LIBS:transistors LIBS:transistors
@ -41,7 +41,7 @@ $Descr A3 16535 11693
encoding utf-8 encoding utf-8
Sheet 3 12 Sheet 3 12
Title "MCU module on STM32F103" Title "MCU module on STM32F103"
Date "28 jan 2015" Date "4 feb 2015"
Rev "" Rev ""
Comp "SAO RAS" Comp "SAO RAS"
Comment1 "" Comment1 ""
@ -296,7 +296,7 @@ L C C5
U 1 1 53997111 U 1 1 53997111
P 4400 1100 P 4400 1100
F 0 "C5" H 4400 1200 40 0000 L CNN F 0 "C5" H 4400 1200 40 0000 L CNN
F 1 "10u" H 4406 1015 40 0000 L CNN F 1 "100u" H 4406 1015 40 0000 L CNN
F 2 "C2" H 4438 950 30 0001 C CNN F 2 "C2" H 4438 950 30 0001 C CNN
F 3 "~" H 4400 1100 60 0000 C CNN F 3 "~" H 4400 1100 60 0000 C CNN
1 4400 1100 1 4400 1100
@ -307,7 +307,7 @@ L C C6
U 1 1 53997130 U 1 1 53997130
P 5350 1100 P 5350 1100
F 0 "C6" H 5350 1200 40 0000 L CNN F 0 "C6" H 5350 1200 40 0000 L CNN
F 1 "100u" H 5356 1015 40 0000 L CNN F 1 "470u" H 5356 1015 40 0000 L CNN
F 2 "C2" H 5388 950 30 0001 C CNN F 2 "C2" H 5388 950 30 0001 C CNN
F 3 "~" H 5350 1100 60 0000 C CNN F 3 "~" H 5350 1100 60 0000 C CNN
1 5350 1100 1 5350 1100

View File

@ -1,4 +1,4 @@
EESchema Schematic File Version 2 date Ср 28 янв 2015 08:47:22 EESchema Schematic File Version 2 date Ср 04 фев 2015 15:06:53
LIBS:power LIBS:power
LIBS:device LIBS:device
LIBS:transistors LIBS:transistors
@ -41,7 +41,7 @@ $Descr A4 11693 8268
encoding utf-8 encoding utf-8
Sheet 5 12 Sheet 5 12
Title "RS-232 level converter" Title "RS-232 level converter"
Date "28 jan 2015" Date "4 feb 2015"
Rev "" Rev ""
Comp "SAO RAS" Comp "SAO RAS"
Comment1 "" Comment1 ""

View File

@ -1,4 +1,4 @@
EESchema Schematic File Version 2 date Ср 28 янв 2015 08:47:22 EESchema Schematic File Version 2 date Ср 04 фев 2015 15:06:53
LIBS:power LIBS:power
LIBS:device LIBS:device
LIBS:transistors LIBS:transistors
@ -41,7 +41,7 @@ $Descr A4 11693 8268
encoding utf-8 encoding utf-8
Sheet 12 12 Sheet 12 12
Title "Power load module" Title "Power load module"
Date "28 jan 2015" Date "4 feb 2015"
Rev "" Rev ""
Comp "SAO RAS" Comp "SAO RAS"
Comment1 "" Comment1 ""

View File

@ -1,4 +1,4 @@
EESchema Schematic File Version 2 date Ср 28 янв 2015 08:47:22 EESchema Schematic File Version 2 date Ср 04 фев 2015 15:06:53
LIBS:power LIBS:power
LIBS:device LIBS:device
LIBS:transistors LIBS:transistors
@ -41,7 +41,7 @@ $Descr A4 11693 8268
encoding utf-8 encoding utf-8
Sheet 4 12 Sheet 4 12
Title "USB input circuit" Title "USB input circuit"
Date "28 jan 2015" Date "4 feb 2015"
Rev "" Rev ""
Comp "SAO RAS" Comp "SAO RAS"
Comment1 "" Comment1 ""

View File

@ -1,4 +1,4 @@
EESchema Schematic File Version 2 date Ср 28 янв 2015 08:47:22 EESchema Schematic File Version 2 date Ср 04 фев 2015 15:06:53
LIBS:power LIBS:power
LIBS:device LIBS:device
LIBS:transistors LIBS:transistors
@ -41,7 +41,7 @@ $Descr A4 11693 8268
encoding utf-8 encoding utf-8
Sheet 8 12 Sheet 8 12
Title "Stepper motor module" Title "Stepper motor module"
Date "28 jan 2015" Date "4 feb 2015"
Rev "" Rev ""
Comp "SAO RAS" Comp "SAO RAS"
Comment1 "" Comment1 ""
@ -152,7 +152,7 @@ AR Path="/53A910B7/50CECA5D" Ref="C3.2" Part="1"
AR Path="/5391724D/50CECA5D" Ref="C3.3" Part="1" AR Path="/5391724D/50CECA5D" Ref="C3.3" Part="1"
AR Path="/53A910BA/50CECA5D" Ref="C3.4" Part="1" AR Path="/53A910BA/50CECA5D" Ref="C3.4" Part="1"
AR Path="/53A910B9/50CECA5D" Ref="C3.5" Part="1" AR Path="/53A910B9/50CECA5D" Ref="C3.5" Part="1"
F 0 "C3.5" H 5550 3350 50 0000 L CNN F 0 "C3.1" H 5550 3350 50 0000 L CNN
F 1 "1n" H 5550 3150 50 0000 L CNN F 1 "1n" H 5550 3150 50 0000 L CNN
F 2 "SM0805" H 5500 3250 60 0001 C CNN F 2 "SM0805" H 5500 3250 60 0001 C CNN
F 3 "" H 5500 3250 60 0001 C CNN F 3 "" H 5500 3250 60 0001 C CNN
@ -168,7 +168,7 @@ AR Path="/53A910B7/50CECA5C" Ref="R6.2" Part="1"
AR Path="/5391724D/50CECA5C" Ref="R6.3" Part="1" AR Path="/5391724D/50CECA5C" Ref="R6.3" Part="1"
AR Path="/53A910BA/50CECA5C" Ref="R6.4" Part="1" AR Path="/53A910BA/50CECA5C" Ref="R6.4" Part="1"
AR Path="/53A910B9/50CECA5C" Ref="R6.5" Part="1" AR Path="/53A910B9/50CECA5C" Ref="R6.5" Part="1"
F 0 "R6.5" V 5580 3000 50 0000 C CNN F 0 "R6.1" V 5580 3000 50 0000 C CNN
F 1 "51k" V 5500 3000 50 0000 C CNN F 1 "51k" V 5500 3000 50 0000 C CNN
F 2 "SM0603" H 5500 3000 60 0001 C CNN F 2 "SM0603" H 5500 3000 60 0001 C CNN
F 3 "" H 5500 3000 60 0001 C CNN F 3 "" H 5500 3000 60 0001 C CNN
@ -232,7 +232,7 @@ AR Path="/53A910B7/50CEC791" Ref="R5.2" Part="1"
AR Path="/5391724D/50CEC791" Ref="R5.3" Part="1" AR Path="/5391724D/50CEC791" Ref="R5.3" Part="1"
AR Path="/53A910BA/50CEC791" Ref="R5.4" Part="1" AR Path="/53A910BA/50CEC791" Ref="R5.4" Part="1"
AR Path="/53A910B9/50CEC791" Ref="R5.5" Part="1" AR Path="/53A910B9/50CEC791" Ref="R5.5" Part="1"
F 0 "R5.5" V 5580 2500 50 0000 C CNN F 0 "R5.1" V 5580 2500 50 0000 C CNN
F 1 "51k" V 5500 2500 50 0000 C CNN F 1 "51k" V 5500 2500 50 0000 C CNN
F 2 "SM0603" H 5500 2500 60 0001 C CNN F 2 "SM0603" H 5500 2500 60 0001 C CNN
F 3 "" H 5500 2500 60 0001 C CNN F 3 "" H 5500 2500 60 0001 C CNN
@ -248,7 +248,7 @@ AR Path="/53A910B7/50CEC790" Ref="C2.2" Part="1"
AR Path="/5391724D/50CEC790" Ref="C2.3" Part="1" AR Path="/5391724D/50CEC790" Ref="C2.3" Part="1"
AR Path="/53A910BA/50CEC790" Ref="C2.4" Part="1" AR Path="/53A910BA/50CEC790" Ref="C2.4" Part="1"
AR Path="/53A910B9/50CEC790" Ref="C2.5" Part="1" AR Path="/53A910B9/50CEC790" Ref="C2.5" Part="1"
F 0 "C2.5" H 5550 2850 50 0000 L CNN F 0 "C2.1" H 5550 2850 50 0000 L CNN
F 1 "1n" H 5550 2650 50 0000 L CNN F 1 "1n" H 5550 2650 50 0000 L CNN
F 2 "SM0805" H 5500 2750 60 0001 C CNN F 2 "SM0805" H 5500 2750 60 0001 C CNN
F 3 "" H 5500 2750 60 0001 C CNN F 3 "" H 5500 2750 60 0001 C CNN
@ -264,7 +264,7 @@ AR Path="/53A910B7/50CEB99A" Ref="R2.2" Part="1"
AR Path="/5391724D/50CEB99A" Ref="R2.3" Part="1" AR Path="/5391724D/50CEB99A" Ref="R2.3" Part="1"
AR Path="/53A910BA/50CEB99A" Ref="R2.4" Part="1" AR Path="/53A910BA/50CEB99A" Ref="R2.4" Part="1"
AR Path="/53A910B9/50CEB99A" Ref="R2.5" Part="1" AR Path="/53A910B9/50CEB99A" Ref="R2.5" Part="1"
F 0 "R2.5" V 4280 2650 50 0000 C CNN F 0 "R2.1" V 4280 2650 50 0000 C CNN
F 1 "0.33" V 4200 2650 50 0000 C CNN F 1 "0.33" V 4200 2650 50 0000 C CNN
F 2 "SM2010" H 4200 2650 60 0001 C CNN F 2 "SM2010" H 4200 2650 60 0001 C CNN
F 3 "" H 4200 2650 60 0001 C CNN F 3 "" H 4200 2650 60 0001 C CNN
@ -280,7 +280,7 @@ AR Path="/53A910B7/50CEB97A" Ref="R1.2" Part="1"
AR Path="/5391724D/50CEB97A" Ref="R1.3" Part="1" AR Path="/5391724D/50CEB97A" Ref="R1.3" Part="1"
AR Path="/53A910BA/50CEB97A" Ref="R1.4" Part="1" AR Path="/53A910BA/50CEB97A" Ref="R1.4" Part="1"
AR Path="/53A910B9/50CEB97A" Ref="R1.5" Part="1" AR Path="/53A910B9/50CEB97A" Ref="R1.5" Part="1"
F 0 "R1.5" V 4280 2450 50 0000 C CNN F 0 "R1.1" V 4280 2450 50 0000 C CNN
F 1 "0.33" V 4200 2450 50 0000 C CNN F 1 "0.33" V 4200 2450 50 0000 C CNN
F 2 "SM2010" H 4200 2450 60 0001 C CNN F 2 "SM2010" H 4200 2450 60 0001 C CNN
F 3 "" H 4200 2450 60 0001 C CNN F 3 "" H 4200 2450 60 0001 C CNN
@ -328,7 +328,7 @@ AR Path="/53A910B7/50AF1E60" Ref="C1.2" Part="1"
AR Path="/5391724D/50AF1E60" Ref="C1.3" Part="1" AR Path="/5391724D/50AF1E60" Ref="C1.3" Part="1"
AR Path="/53A910BA/50AF1E60" Ref="C1.4" Part="1" AR Path="/53A910BA/50AF1E60" Ref="C1.4" Part="1"
AR Path="/53A910B9/50AF1E60" Ref="C1.5" Part="1" AR Path="/53A910B9/50AF1E60" Ref="C1.5" Part="1"
F 0 "C1.5" H 5100 5100 50 0000 L CNN F 0 "C1.1" H 5100 5100 50 0000 L CNN
F 1 "68n" H 5100 4900 50 0000 L CNN F 1 "68n" H 5100 4900 50 0000 L CNN
F 2 "SM0805" H 5050 5000 60 0001 C CNN F 2 "SM0805" H 5050 5000 60 0001 C CNN
F 3 "" H 5050 5000 60 0001 C CNN F 3 "" H 5050 5000 60 0001 C CNN
@ -376,7 +376,7 @@ AR Path="/53A910B7/50AF1C25" Ref="R3.2" Part="1"
AR Path="/5391724D/50AF1C25" Ref="R3.3" Part="1" AR Path="/5391724D/50AF1C25" Ref="R3.3" Part="1"
AR Path="/53A910BA/50AF1C25" Ref="R3.4" Part="1" AR Path="/53A910BA/50AF1C25" Ref="R3.4" Part="1"
AR Path="/53A910B9/50AF1C25" Ref="R3.5" Part="1" AR Path="/53A910B9/50AF1C25" Ref="R3.5" Part="1"
F 0 "R3.5" V 4480 5050 50 0000 C CNN F 0 "R3.1" V 4480 5050 50 0000 C CNN
F 1 "22k" V 4400 5050 50 0000 C CNN F 1 "22k" V 4400 5050 50 0000 C CNN
F 2 "SM0603" H 4400 5050 60 0001 C CNN F 2 "SM0603" H 4400 5050 60 0001 C CNN
F 3 "" H 4400 5050 60 0001 C CNN F 3 "" H 4400 5050 60 0001 C CNN
@ -392,7 +392,7 @@ AR Path="/53A910B7/50AE2A4D" Ref="DD2.2" Part="1"
AR Path="/5391724D/50AE2A4D" Ref="DD2.3" Part="1" AR Path="/5391724D/50AE2A4D" Ref="DD2.3" Part="1"
AR Path="/53A910BA/50AE2A4D" Ref="DD2.4" Part="1" AR Path="/53A910BA/50AE2A4D" Ref="DD2.4" Part="1"
AR Path="/53A910B9/50AE2A4D" Ref="DD2.5" Part="1" AR Path="/53A910B9/50AE2A4D" Ref="DD2.5" Part="1"
F 0 "DD2.5" H 3800 4600 50 0000 L BNN F 0 "DD2.1" H 3800 4600 50 0000 L BNN
F 1 "L6208N" H 4300 2850 50 0000 L BNN F 1 "L6208N" H 4300 2850 50 0000 L BNN
F 2 "DIP-24__300_ELL" H 4300 3900 50 0001 C CNN F 2 "DIP-24__300_ELL" H 4300 3900 50 0001 C CNN
F 3 "" H 4300 3750 60 0001 C CNN F 3 "" H 4300 3750 60 0001 C CNN
@ -436,7 +436,7 @@ AR Path="/53A910B7/534BB108" Ref="R4.2" Part="1"
AR Path="/5391724D/534BB108" Ref="R4.3" Part="1" AR Path="/5391724D/534BB108" Ref="R4.3" Part="1"
AR Path="/53A910BA/534BB108" Ref="R4.4" Part="1" AR Path="/53A910BA/534BB108" Ref="R4.4" Part="1"
AR Path="/53A910B9/534BB108" Ref="R4.5" Part="1" AR Path="/53A910B9/534BB108" Ref="R4.5" Part="1"
F 0 "R4.5" V 4780 5050 40 0000 C CNN F 0 "R4.1" V 4780 5050 40 0000 C CNN
F 1 "1.8k" V 4707 5051 40 0000 C CNN F 1 "1.8k" V 4707 5051 40 0000 C CNN
F 2 "SM0603" V 4630 5050 30 0001 C CNN F 2 "SM0603" V 4630 5050 30 0001 C CNN
F 3 "~" H 4700 5050 30 0000 C CNN F 3 "~" H 4700 5050 30 0000 C CNN

View File

@ -1,4 +1,4 @@
EESchema Schematic File Version 2 date Ср 28 янв 2015 08:47:22 EESchema Schematic File Version 2 date Ср 04 фев 2015 15:06:53
LIBS:power LIBS:power
LIBS:device LIBS:device
LIBS:transistors LIBS:transistors
@ -41,7 +41,7 @@ $Descr A4 11693 8268
encoding utf-8 encoding utf-8
Sheet 11 12 Sheet 11 12
Title "Power load module" Title "Power load module"
Date "28 jan 2015" Date "4 feb 2015"
Rev "" Rev ""
Comp "SAO RAS" Comp "SAO RAS"
Comment1 "" Comment1 ""

View File

@ -118,11 +118,14 @@ void ADC_calibrate_and_start();
#define SHUTTER_ON_PIN (GPIO2) #define SHUTTER_ON_PIN (GPIO2)
#define SHUTTER_POLARITY_PIN (GPIO0) #define SHUTTER_POLARITY_PIN (GPIO0)
#define SHUTTER_FB_PIN (GPIO1) #define SHUTTER_FB_PIN (GPIO1)
// voltage (*100) threshold to run shutter // voltage (*100) threshold to run shutter - 20V
#define SHUTTER_VOLTAGE_THRES (1000) #define SHUTTER_VOLTAGE_THRES (2000)
#define SHUTTER_UNDERVOLTAGE_THRES (500) // minimum voltage that should be on capasitor if power source is on
// delay in operations in us #define SHUTTER_UNDERVOLTAGE_THRES (700)
#define SHUTTER_DELAY (10000) // delay in operations (open/close) in us (according to shutter's datasheet it's about 12ms)
#define SHUTTER_DELAY (12500)
// delay for error test
#define SHUTTER_OP_DELAY (200)
// ADC_value[8] is U36, ADC_value[9] is U10 // ADC_value[8] is U36, ADC_value[9] is U10
#define SHUTTER_SENSE_VALUE (ADC_value[8]) #define SHUTTER_SENSE_VALUE (ADC_value[8])

View File

@ -200,6 +200,8 @@ int main(){
if(Timer - Old_timer > 999){ // one-second cycle if(Timer - Old_timer > 999){ // one-second cycle
Old_timer += 1000; Old_timer += 1000;
if(Shutter_State == SHUTTER_NOTREADY)
shutter_init();
//OW_fill_ID(0); //OW_fill_ID(0);
//gpio_toggle(GPIOC, GPIO12); // toggle LED //gpio_toggle(GPIOC, GPIO12); // toggle LED
//gpio_toggle(GPIO_BANK_SPI2_MOSI, GPIO_SPI2_MOSI); //gpio_toggle(GPIO_BANK_SPI2_MOSI, GPIO_SPI2_MOSI);

View File

@ -22,6 +22,7 @@
#include "main.h" #include "main.h"
// state of shutter - global variable to omit interface functions // state of shutter - global variable to omit interface functions
shutter_state Shutter_State = SHUTTER_NOTREADY; shutter_state Shutter_State = SHUTTER_NOTREADY;
uint16_t Shutter_delay = SHUTTER_DELAY;
// function to be runned from timer irq // function to be runned from timer irq
void (*shutter_timer_fn)() = NULL; void (*shutter_timer_fn)() = NULL;
@ -33,13 +34,16 @@ void (*shutter_timer_fn)() = NULL;
*/ */
void shutter_wait(int us, void(*fn_ready)()){ void shutter_wait(int us, void(*fn_ready)()){
if(!fn_ready) return; if(!fn_ready) return;
//DBG("wait for previous .. ");
while(shutter_timer_fn); // wait for ending of previous operation while(shutter_timer_fn); // wait for ending of previous operation
//DBG("ok\n");
shutter_timer_fn = fn_ready; shutter_timer_fn = fn_ready;
timer_set_period(SHUTTER_TIM, us); timer_set_period(SHUTTER_TIM, us);
timer_enable_counter(SHUTTER_TIM); timer_enable_counter(SHUTTER_TIM);
} }
// macro to open/close/set default state // macro to open/close/set default state
// open shutter is 0:0 -> when MCU power is off, shutter "automatically" opens
#define shutter_open() do{gpio_clear(SHUTTER_PORT, SHUTTER_ON_PIN | SHUTTER_POLARITY_PIN);}while(0) #define shutter_open() do{gpio_clear(SHUTTER_PORT, SHUTTER_ON_PIN | SHUTTER_POLARITY_PIN);}while(0)
#define shutter_close() do{gpio_clear(SHUTTER_PORT, SHUTTER_ON_PIN); \ #define shutter_close() do{gpio_clear(SHUTTER_PORT, SHUTTER_ON_PIN); \
gpio_set(SHUTTER_PORT, SHUTTER_POLARITY_PIN);}while(0) gpio_set(SHUTTER_PORT, SHUTTER_POLARITY_PIN);}while(0)
@ -48,16 +52,62 @@ void shutter_wait(int us, void(*fn_ready)()){
gpio_clear(SHUTTER_PORT, SHUTTER_POLARITY_PIN);}while(0) gpio_clear(SHUTTER_PORT, SHUTTER_POLARITY_PIN);}while(0)
#define shutter_error() ((gpio_get(SHUTTER_PORT, SHUTTER_FB_PIN) == 0)) #define shutter_error() ((gpio_get(SHUTTER_PORT, SHUTTER_FB_PIN) == 0))
/**
* Make tests for undervoltage & wire breakage
* this function calls in 2 stages:
* 1) check undervoltage & set hiZ
* 2) repeat checking undervoltage & check wire breakage
* if shutter was uninitialized we open it
*/
void shutter_test(){
static shutter_state old_State = SHUTTER_NOTREADY;
// test for undervoltage
if(shutter_voltage() < SHUTTER_UNDERVOLTAGE_THRES){
ERR("shutter undervoltage\n");
Shutter_State = SHUTTER_NOTREADY;
shutter_off();
return;
}
if(Shutter_State != SHUTTER_INITIALIZED){ // first call of this function
old_State = Shutter_State;
Shutter_State = SHUTTER_INITIALIZED;
// test for wire breakage
DBG("breakage test\n");
shutter_hiZ(); // 1,1: breakage test
shutter_wait(SHUTTER_OP_DELAY, shutter_test);
}else{ // check breakage
if(shutter_error()){ // ERR==0 -> wire breakage
ERR("shutter wire breakage\n");
Shutter_State = SHUTTER_NOTREADY;
}else{
if(old_State == SHUTTER_NOTREADY){
Shutter_State = SHUTTER_OPENING;
DBG("ready!\n");
}else{
Shutter_State = old_State;
DBG("no errors\n");
}
}
shutter_off();
}
}
/** /**
* after open/close pulse we should return bridge to default state * after open/close pulse we should return bridge to default state
* 3 stages:
* 1) check for short-circuit & turn off power of the shutter
* 2) check for overtemperature or undervoltage
* 3) common test for undervoltage/breakage
*/ */
void shutter_ready(){ void shutter_ready(){
uint8_t test_err = 0; uint8_t test_err = 0;
//DBG("shtr ready\n");
switch (Shutter_State){ switch (Shutter_State){
case SHUTTER_CLOSED: // repeated pulse to check errors case SHUTTER_CLOSED: // repeated pulse to check errors
case SHUTTER_OPENED: case SHUTTER_OPENED:
if(shutter_error()){ if(shutter_error()){
ERR("shutter vertemperature or undervoltage\n"); ERR("shutter overtemperature or undervoltage\n");
Shutter_State = SHUTTER_NOTREADY; Shutter_State = SHUTTER_NOTREADY;
} }
break; break;
@ -66,7 +116,6 @@ void shutter_ready(){
if(shutter_error()){ if(shutter_error()){
ERR("shutter short-circuit\n"); ERR("shutter short-circuit\n");
Shutter_State = SHUTTER_NOTREADY; Shutter_State = SHUTTER_NOTREADY;
shutter_off();
}else{ }else{
test_err = 1; test_err = 1;
if(Shutter_State == SHUTTER_PROC_CLOSING) if(Shutter_State == SHUTTER_PROC_CLOSING)
@ -77,9 +126,17 @@ void shutter_ready(){
break; break;
default: default:
ERR("wrong shutter state\n"); ERR("wrong shutter state\n");
print_shutter_state(lastsendfun);
} }
shutter_off(); shutter_off();
if(test_err) shutter_wait(SHUTTER_DELAY, shutter_ready); // test for overtemp or undervoltage if(Shutter_State == SHUTTER_NOTREADY) return;
if(test_err){
//DBG("now test for err\n");
shutter_wait(SHUTTER_OP_DELAY, shutter_ready); // test for overtemp or undervoltage
}else{
// wait a lot of time to prevent false detections
shutter_wait(SHUTTER_DELAY, shutter_test);
}
} }
/** /**
@ -98,7 +155,8 @@ shutter_state shutter_init(){
// 72MHz div 72 = 1MHz // 72MHz div 72 = 1MHz
timer_set_prescaler(SHUTTER_TIM, 71); timer_set_prescaler(SHUTTER_TIM, 71);
timer_one_shot_mode(SHUTTER_TIM); // single pulse mode timer_one_shot_mode(SHUTTER_TIM); // single pulse mode
timer_enable_preload(SHUTTER_TIM); // force changing period timer_disable_preload(SHUTTER_TIM); // force changing period
timer_update_on_overflow(SHUTTER_TIM); // generate UEV only on overflow
timer_enable_update_event(SHUTTER_TIM); timer_enable_update_event(SHUTTER_TIM);
timer_enable_irq(SHUTTER_TIM, TIM_DIER_UIE); // update IRQ enable timer_enable_irq(SHUTTER_TIM, TIM_DIER_UIE); // update IRQ enable
//DBG("shutter timer ready\n"); //DBG("shutter timer ready\n");
@ -109,20 +167,9 @@ shutter_state shutter_init(){
// feedback: floating input // feedback: floating input
gpio_set_mode(SHUTTER_PORT, GPIO_MODE_INPUT, gpio_set_mode(SHUTTER_PORT, GPIO_MODE_INPUT,
GPIO_CNF_INPUT_FLOAT, SHUTTER_FB_PIN); GPIO_CNF_INPUT_FLOAT, SHUTTER_FB_PIN);
// test for wire breakage
shutter_hiZ(); // 1,1: breakage test
Delay(1); // wait for 1ms
if(shutter_error()){ // ERR==0 -> wire breakage
if(shutter_voltage() < SHUTTER_UNDERVOLTAGE_THRES)
ERR("shutter undervoltage\n");
else
ERR("shutter wire breakage\n");
}else{
// Shutter_State = SHUTTER_CLOSING; // now try to close shutter
Shutter_State = SHUTTER_READY;
}
shutter_off(); shutter_off();
return Shutter_State; shutter_wait(SHUTTER_OP_DELAY, shutter_test);
return SHUTTER_INITIALIZED; // we return this state in spite of the shutter isn't really initialized yet
} }
/** /**
@ -131,14 +178,21 @@ shutter_state shutter_init(){
*/ */
void process_shutter(){ void process_shutter(){
if(Shutter_State == SHUTTER_NOTREADY) return; if(Shutter_State == SHUTTER_NOTREADY) return;
if(shutter_error()){
ERR("shutter some error\n"); if(Shutter_State != SHUTTER_OPENING && Shutter_State != SHUTTER_CLOSING)
return;
if(shutter_voltage() < SHUTTER_UNDERVOLTAGE_THRES){
ERR("no shutter power source\n");
Shutter_State = SHUTTER_NOTREADY; Shutter_State = SHUTTER_NOTREADY;
shutter_off(); shutter_off();
return; return;
} }
if(Shutter_State != SHUTTER_OPENING && Shutter_State != SHUTTER_CLOSING) if(shutter_error()){
ERR("some shutter error\n");
Shutter_State = SHUTTER_NOTREADY;
shutter_off();
return; return;
}
if(shutter_voltage() < SHUTTER_VOLTAGE_THRES) return; // capasitor isn't charged if(shutter_voltage() < SHUTTER_VOLTAGE_THRES) return; // capasitor isn't charged
switch (Shutter_State){ switch (Shutter_State){
case SHUTTER_OPENING: case SHUTTER_OPENING:
@ -152,30 +206,32 @@ void process_shutter(){
default: default:
return; return;
} }
shutter_wait(SHUTTER_DELAY, shutter_ready); shutter_wait(Shutter_delay, shutter_ready);
} }
void Shutter_tim_isr(){ void Shutter_tim_isr(){
//DBG("shutter timer\n");
void (*fn)() = shutter_timer_fn;
if(timer_get_flag(SHUTTER_TIM, TIM_SR_UIF)){ if(timer_get_flag(SHUTTER_TIM, TIM_SR_UIF)){
// Clear compare interrupt flag // Clear compare interrupt flag
timer_clear_flag(SHUTTER_TIM, TIM_SR_UIF); timer_clear_flag(SHUTTER_TIM, TIM_SR_UIF);
shutter_timer_fn = NULL;
// and run needed function // and run needed function
if(shutter_timer_fn){ if(fn){
shutter_timer_fn(); fn();
shutter_timer_fn = NULL;
} }
} }
} }
/* /**
* printout shutter state * printout shutter state
*/ */
void print_shutter_state(sendfun s){ void print_shutter_state(sendfun s){
P("shutter ", s); P("shutter ", s);
if(shutter_error()){ // ERR==0 -> wire breakage
P("(error) ", s);
}
switch (Shutter_State){ switch (Shutter_State){
case SHUTTER_INITIALIZED:
P("testing", s);
break;
case SHUTTER_READY: case SHUTTER_READY:
P("ready", s); P("ready", s);
break; break;
@ -196,26 +252,40 @@ if(shutter_error()){ // ERR==0 -> wire breakage
P("in process", s); P("in process", s);
break; break;
default: // not ready or error default: // not ready or error
P("not initialised or broken", s); if(shutter_error()){ // ERR==0 -> wire breakage or something else
P("error", s);
}else
P("not initialised or broken", s);
} }
newline(s); newline(s);
} }
/**
/* * Try to open/close shutter depending on argument:
switch (Shutter_State){ * state == SHUTTER_CLOSING - try to close
* state == SHUTTER_OPENING - try to open
*/
void shutter_try(shutter_state state){
switch (Shutter_State){ // right states are only OPENED, CLOSED & READY
case SHUTTER_OPENED: case SHUTTER_OPENED:
if(state == SHUTTER_OPENING){ // try to open opened shutter?
P("alerady opened\n", lastsendfun);
return;
}
break; break;
case SHUTTER_CLOSED: case SHUTTER_CLOSED:
if(state == SHUTTER_CLOSING){ // try to close closed?
P("alerady closed\n", lastsendfun);
return;
}
break; break;
case SHUTTER_OPENING: case SHUTTER_READY:
break; ; // All OK
case SHUTTER_CLOSING:
break;
case SHUTTER_PROC_OPENING:
break;
case SHUTTER_PROC_CLOSING:
break; break;
default: default:
print_shutter_state(lastsendfun);
return;
} }
*/ Shutter_State = state; // all OK, now we can change current state of shutter
}

View File

@ -27,8 +27,9 @@
// Shutter finite-state machine states // Shutter finite-state machine states
typedef enum{ typedef enum{
SHUTTER_NOTREADY = 0, // initialisation - not ready, or error in work SHUTTER_NOTREADY = 0, // not ready, or error in work
SHUTTER_READY, SHUTTER_INITIALIZED, // initialisation in process
SHUTTER_READY, // ready for operation
SHUTTER_OPENED, // shutter is in opened state SHUTTER_OPENED, // shutter is in opened state
SHUTTER_CLOSED, // shutter is in closed state SHUTTER_CLOSED, // shutter is in closed state
SHUTTER_OPENING, // user is waiting for opening SHUTTER_OPENING, // user is waiting for opening
@ -38,9 +39,15 @@ typedef enum{
} shutter_state; } shutter_state;
extern shutter_state Shutter_State; extern shutter_state Shutter_State;
extern uint16_t Shutter_delay;
shutter_state shutter_init(); shutter_state shutter_init();
void process_shutter(); void process_shutter();
void print_shutter_state(sendfun s); void print_shutter_state(sendfun s);
void shutter_try(shutter_state state);
#define try_to_close_shutter() shutter_try(SHUTTER_CLOSING)
#define try_to_open_shutter() shutter_try(SHUTTER_OPENING)
#endif // __POWERHW_H__ #endif // __POWERHW_H__

View File

@ -64,6 +64,13 @@ void print_ad_vals(sendfun s){
} }
} }
void set_shtr_delay(int32_t v, sendfun s){
uint16_t d = (uint16_t) v;
Shutter_delay = d;
P("Change delay to ", s);
print_int(d, s);
}
void parce_incoming_buf(char *buf, int len, sendfun s){ void parce_incoming_buf(char *buf, int len, sendfun s){
uint8_t command; uint8_t command;
int i = 0, j, m; int i = 0, j, m;
@ -185,14 +192,14 @@ void parce_incoming_buf(char *buf, int len, sendfun s){
print_shutter_state(s); print_shutter_state(s);
break; break;
case 'c': // close shutter case 'c': // close shutter
if(Shutter_State != SHUTTER_CLOSED) try_to_close_shutter();
Shutter_State = SHUTTER_CLOSING;
else P("alerady closed\n", s);
break; break;
case 'o': // open shutter case 'o': // open shutter
if(Shutter_State != SHUTTER_OPENED) try_to_open_shutter();
Shutter_State = SHUTTER_OPENING; break;
else P("alerady opened\n", s); case 'z': // temporary: change delay
I = set_shtr_delay;
READINT();
break; break;
case '\n': // show newline as is case '\n': // show newline as is
break; break;