mirror of
https://github.com/eddyem/IR-controller.git
synced 2026-03-21 01:01:07 +03:00
Shutter module tested
This commit is contained in:
@@ -118,11 +118,14 @@ void ADC_calibrate_and_start();
|
||||
#define SHUTTER_ON_PIN (GPIO2)
|
||||
#define SHUTTER_POLARITY_PIN (GPIO0)
|
||||
#define SHUTTER_FB_PIN (GPIO1)
|
||||
// voltage (*100) threshold to run shutter
|
||||
#define SHUTTER_VOLTAGE_THRES (1000)
|
||||
#define SHUTTER_UNDERVOLTAGE_THRES (500)
|
||||
// delay in operations in us
|
||||
#define SHUTTER_DELAY (10000)
|
||||
// voltage (*100) threshold to run shutter - 20V
|
||||
#define SHUTTER_VOLTAGE_THRES (2000)
|
||||
// minimum voltage that should be on capasitor if power source is on
|
||||
#define SHUTTER_UNDERVOLTAGE_THRES (700)
|
||||
// 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
|
||||
#define SHUTTER_SENSE_VALUE (ADC_value[8])
|
||||
|
||||
@@ -200,6 +200,8 @@ int main(){
|
||||
|
||||
if(Timer - Old_timer > 999){ // one-second cycle
|
||||
Old_timer += 1000;
|
||||
if(Shutter_State == SHUTTER_NOTREADY)
|
||||
shutter_init();
|
||||
//OW_fill_ID(0);
|
||||
//gpio_toggle(GPIOC, GPIO12); // toggle LED
|
||||
//gpio_toggle(GPIO_BANK_SPI2_MOSI, GPIO_SPI2_MOSI);
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "main.h"
|
||||
// state of shutter - global variable to omit interface functions
|
||||
shutter_state Shutter_State = SHUTTER_NOTREADY;
|
||||
uint16_t Shutter_delay = SHUTTER_DELAY;
|
||||
|
||||
// function to be runned from timer irq
|
||||
void (*shutter_timer_fn)() = NULL;
|
||||
@@ -33,13 +34,16 @@ void (*shutter_timer_fn)() = NULL;
|
||||
*/
|
||||
void shutter_wait(int us, void(*fn_ready)()){
|
||||
if(!fn_ready) return;
|
||||
//DBG("wait for previous .. ");
|
||||
while(shutter_timer_fn); // wait for ending of previous operation
|
||||
//DBG("ok\n");
|
||||
shutter_timer_fn = fn_ready;
|
||||
timer_set_period(SHUTTER_TIM, us);
|
||||
timer_enable_counter(SHUTTER_TIM);
|
||||
}
|
||||
|
||||
// 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_close() do{gpio_clear(SHUTTER_PORT, SHUTTER_ON_PIN); \
|
||||
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)
|
||||
#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
|
||||
* 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(){
|
||||
uint8_t test_err = 0;
|
||||
//DBG("shtr ready\n");
|
||||
switch (Shutter_State){
|
||||
case SHUTTER_CLOSED: // repeated pulse to check errors
|
||||
case SHUTTER_OPENED:
|
||||
if(shutter_error()){
|
||||
ERR("shutter vertemperature or undervoltage\n");
|
||||
ERR("shutter overtemperature or undervoltage\n");
|
||||
Shutter_State = SHUTTER_NOTREADY;
|
||||
}
|
||||
break;
|
||||
@@ -66,7 +116,6 @@ void shutter_ready(){
|
||||
if(shutter_error()){
|
||||
ERR("shutter short-circuit\n");
|
||||
Shutter_State = SHUTTER_NOTREADY;
|
||||
shutter_off();
|
||||
}else{
|
||||
test_err = 1;
|
||||
if(Shutter_State == SHUTTER_PROC_CLOSING)
|
||||
@@ -77,9 +126,17 @@ void shutter_ready(){
|
||||
break;
|
||||
default:
|
||||
ERR("wrong shutter state\n");
|
||||
print_shutter_state(lastsendfun);
|
||||
}
|
||||
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
|
||||
timer_set_prescaler(SHUTTER_TIM, 71);
|
||||
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_irq(SHUTTER_TIM, TIM_DIER_UIE); // update IRQ enable
|
||||
//DBG("shutter timer ready\n");
|
||||
@@ -109,20 +167,9 @@ shutter_state shutter_init(){
|
||||
// feedback: floating input
|
||||
gpio_set_mode(SHUTTER_PORT, GPIO_MODE_INPUT,
|
||||
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();
|
||||
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(){
|
||||
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_off();
|
||||
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;
|
||||
}
|
||||
if(shutter_voltage() < SHUTTER_VOLTAGE_THRES) return; // capasitor isn't charged
|
||||
switch (Shutter_State){
|
||||
case SHUTTER_OPENING:
|
||||
@@ -152,30 +206,32 @@ void process_shutter(){
|
||||
default:
|
||||
return;
|
||||
}
|
||||
shutter_wait(SHUTTER_DELAY, shutter_ready);
|
||||
shutter_wait(Shutter_delay, shutter_ready);
|
||||
}
|
||||
|
||||
void Shutter_tim_isr(){
|
||||
//DBG("shutter timer\n");
|
||||
void (*fn)() = shutter_timer_fn;
|
||||
if(timer_get_flag(SHUTTER_TIM, TIM_SR_UIF)){
|
||||
// Clear compare interrupt flag
|
||||
timer_clear_flag(SHUTTER_TIM, TIM_SR_UIF);
|
||||
shutter_timer_fn = NULL;
|
||||
// and run needed function
|
||||
if(shutter_timer_fn){
|
||||
shutter_timer_fn();
|
||||
shutter_timer_fn = NULL;
|
||||
if(fn){
|
||||
fn();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* printout shutter state
|
||||
*/
|
||||
void print_shutter_state(sendfun s){
|
||||
P("shutter ", s);
|
||||
if(shutter_error()){ // ERR==0 -> wire breakage
|
||||
P("(error) ", s);
|
||||
}
|
||||
switch (Shutter_State){
|
||||
case SHUTTER_INITIALIZED:
|
||||
P("testing", s);
|
||||
break;
|
||||
case SHUTTER_READY:
|
||||
P("ready", s);
|
||||
break;
|
||||
@@ -196,26 +252,40 @@ if(shutter_error()){ // ERR==0 -> wire breakage
|
||||
P("in process", s);
|
||||
break;
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
switch (Shutter_State){
|
||||
/**
|
||||
* Try to open/close shutter depending on argument:
|
||||
* 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:
|
||||
if(state == SHUTTER_OPENING){ // try to open opened shutter?
|
||||
P("alerady opened\n", lastsendfun);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case SHUTTER_CLOSED:
|
||||
if(state == SHUTTER_CLOSING){ // try to close closed?
|
||||
P("alerady closed\n", lastsendfun);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case SHUTTER_OPENING:
|
||||
break;
|
||||
case SHUTTER_CLOSING:
|
||||
break;
|
||||
case SHUTTER_PROC_OPENING:
|
||||
break;
|
||||
case SHUTTER_PROC_CLOSING:
|
||||
case SHUTTER_READY:
|
||||
; // All OK
|
||||
break;
|
||||
default:
|
||||
print_shutter_state(lastsendfun);
|
||||
return;
|
||||
}
|
||||
*/
|
||||
Shutter_State = state; // all OK, now we can change current state of shutter
|
||||
}
|
||||
|
||||
|
||||
@@ -27,8 +27,9 @@
|
||||
|
||||
// Shutter finite-state machine states
|
||||
typedef enum{
|
||||
SHUTTER_NOTREADY = 0, // initialisation - not ready, or error in work
|
||||
SHUTTER_READY,
|
||||
SHUTTER_NOTREADY = 0, // not ready, or error in work
|
||||
SHUTTER_INITIALIZED, // initialisation in process
|
||||
SHUTTER_READY, // ready for operation
|
||||
SHUTTER_OPENED, // shutter is in opened state
|
||||
SHUTTER_CLOSED, // shutter is in closed state
|
||||
SHUTTER_OPENING, // user is waiting for opening
|
||||
@@ -38,9 +39,15 @@ typedef enum{
|
||||
} shutter_state;
|
||||
|
||||
extern shutter_state Shutter_State;
|
||||
extern uint16_t Shutter_delay;
|
||||
|
||||
shutter_state shutter_init();
|
||||
void process_shutter();
|
||||
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__
|
||||
|
||||
@@ -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){
|
||||
uint8_t command;
|
||||
int i = 0, j, m;
|
||||
@@ -185,14 +192,14 @@ void parce_incoming_buf(char *buf, int len, sendfun s){
|
||||
print_shutter_state(s);
|
||||
break;
|
||||
case 'c': // close shutter
|
||||
if(Shutter_State != SHUTTER_CLOSED)
|
||||
Shutter_State = SHUTTER_CLOSING;
|
||||
else P("alerady closed\n", s);
|
||||
try_to_close_shutter();
|
||||
break;
|
||||
case 'o': // open shutter
|
||||
if(Shutter_State != SHUTTER_OPENED)
|
||||
Shutter_State = SHUTTER_OPENING;
|
||||
else P("alerady opened\n", s);
|
||||
try_to_open_shutter();
|
||||
break;
|
||||
case 'z': // temporary: change delay
|
||||
I = set_shtr_delay;
|
||||
READINT();
|
||||
break;
|
||||
case '\n': // show newline as is
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user