nothing works, 2 mosfets died...

This commit is contained in:
Edward Emelianov 2024-03-05 15:35:34 +03:00
parent 1ecea45cc0
commit c6e8347d23
8 changed files with 84 additions and 20 deletions

View File

@ -20,6 +20,9 @@
#include "buttons.h" #include "buttons.h"
#include "hardware.h" #include "hardware.h"
#ifdef EBUG
#include "usart.h"
#endif
extern volatile uint32_t Tms; extern volatile uint32_t Tms;
//uint32_t lastUnsleep = 0; //uint32_t lastUnsleep = 0;
@ -28,22 +31,24 @@ extern volatile uint32_t Tms;
#define PRESSTHRESHOLD (29) #define PRESSTHRESHOLD (29)
// HOLDTHRESHOLD = PRESSTHRESHOLD + hold time // HOLDTHRESHOLD = PRESSTHRESHOLD + hold time
#define HOLDTHRESHOLD (329) #define HOLDTHRESHOLD (329)
/*
typedef struct{ typedef struct{
keyevent event; // current key event keyevent event; // current key event
int16_t counter; // press/release milliseconds counter int16_t counter; // press/release milliseconds counter
GPIO_TypeDef *port; // key port GPIO_TypeDef *port; // key port
uint16_t pin; // key pin uint16_t pin; // key pin
uint8_t changed; // the event have been changed uint8_t changed : 1; // the event have been changed
uint8_t inverted : 1; // button inverted: 0 - passive, 1 - active
} keybase; } keybase;
*/
// HALLs are inverted as disconnected when active
keybase allkeys[KEY_AMOUNT] = { keybase allkeys[KEY_AMOUNT] = {
[HALL_D] = {.port = HALL_PORT, .pin = HALL_D_PIN}, [HALL_D] = {.port = HALL_PORT, .pin = HALL_D_PIN, .inverted = 1},
[HALL_U] = {.port = HALL_PORT, .pin = HALL_U_PIN}, [HALL_U] = {.port = HALL_PORT, .pin = HALL_U_PIN, .inverted = 1},
[KEY_D] = {.port = BUTTON_PORT, .pin = BUTTON_D_PIN}, [KEY_D] = {.port = BUTTON_PORT, .pin = BUTTON_D_PIN},
[KEY_U] = {.port = BUTTON_PORT, .pin = BUTTON_U_PIN}, [KEY_U] = {.port = BUTTON_PORT, .pin = BUTTON_U_PIN},
[DIR_D] = {.port = DIR_PORT, .pin = DIR_U_PIN}, [DIR_D] = {.port = DIR_PORT, .pin = DIR_D_PIN, .inverted = 1},
[DIR_U] = {.port = DIR_PORT, .pin = DIR_U_PIN} [DIR_U] = {.port = DIR_PORT, .pin = DIR_U_PIN, .inverted = 1}
}; };
// return 1 if something was changed // return 1 if something was changed
@ -56,7 +61,7 @@ int process_keys(){
for(int i = 0; i < KEY_AMOUNT; ++i){ for(int i = 0; i < KEY_AMOUNT; ++i){
keybase *k = &allkeys[i]; keybase *k = &allkeys[i];
keyevent e = k->event; keyevent e = k->event;
if(PRESSED(k->port, k->pin)){ // key is in pressed state if(PRESSED(k->port, k->pin) != k->inverted){ // key is in pressed state
//lastUnsleep = Tms; // update activity time (any key is in pressed state) //lastUnsleep = Tms; // update activity time (any key is in pressed state)
switch(e){ switch(e){
case EVT_NONE: // just pressed case EVT_NONE: // just pressed

View File

@ -42,6 +42,15 @@ typedef enum{
EVT_RELEASE // released EVT_RELEASE // released
} keyevent; } keyevent;
typedef struct{
keyevent event; // current key event
int16_t counter; // press/release milliseconds counter
GPIO_TypeDef *port; // key port
uint16_t pin; // key pin
uint8_t changed : 1; // the event have been changed
uint8_t inverted : 1; // button inverted: 0 - passive, 1 - active
} keybase;
//extern uint32_t lastUnsleep; // last keys activity time //extern uint32_t lastUnsleep; // last keys activity time
int process_keys(); int process_keys();

View File

@ -96,10 +96,13 @@ int motor_ctl(int32_t dir){
} }
accel = 1; accel = 1;
direction = dir; direction = dir;
keyevent uh = keyevt(HALL_U), dh = keyevt(HALL_D);
if(dir == MOTDIR_UP){ // start in positive direction (move UP) if(dir == MOTDIR_UP){ // start in positive direction (move UP)
if(uh == EVT_PRESS || uh == EVT_HOLD) return FALSE; // can't move in given direction
set_up(UP_LEFT); set_up(UP_LEFT);
set_pwm(PWM_RIGHT, 1); set_pwm(PWM_RIGHT, 1);
}else{ // negative (move DOWN) }else{ // negative (move DOWN)
if(dh == EVT_PRESS || dh == EVT_HOLD) return FALSE;
set_up(UP_RIGHT); set_up(UP_RIGHT);
set_pwm(PWM_LEFT, 1); set_pwm(PWM_LEFT, 1);
} }
@ -134,29 +137,30 @@ void motor_process(){
} }
} }
} }
keyevent uh = keyevt(HALL_U), dh = keyevt(HALL_D); // current hall states - if we cannot move upper or lower // short key pressed - full open/close (or stop while moving); long - move with stop after release
// short key pressed - full open/close; long - move with stop after release
if(MOTDIR_BREAK != newdir){ // process keys if don't need to break if(MOTDIR_BREAK != newdir){ // process keys if don't need to break
evt = EVT_NONE; evt = EVT_NONE;
if(keystate(KEY_U, &evt)){ if(keystate(KEY_U, &evt)){
if(evt == EVT_PRESS){ // move up (don't mind EVT_HOLD - it's already moving) if(evt == EVT_PRESS){
if(uh != EVT_HOLD && uh != EVT_PRESS) newdir = MOTDIR_UP; if(direction == MOTDIR_UP || direction == MOTDIR_DOWN) newdir = MOTDIR_STOP;
else newdir = MOTDIR_UP;
} }
}else if(keystate(KEY_D, &evt)){ }else if(keystate(KEY_D, &evt)){
if(evt == EVT_PRESS){ if(evt == EVT_PRESS){
if(dh != EVT_HOLD && dh != EVT_PRESS) newdir = MOTDIR_DOWN; if(direction == MOTDIR_UP || direction == MOTDIR_DOWN) newdir = MOTDIR_STOP;
else newdir = MOTDIR_DOWN;
} }
} }
if(evt == EVT_RELEASE) newdir = MOTDIR_STOP; if(evt == EVT_RELEASE) newdir = MOTDIR_STOP; // stop after long press
evt = EVT_NONE; evt = EVT_NONE;
int extsig = FALSE; int extsig = FALSE;
// now chech external signals, they have an advantage over local keys // now chech external signals, they have an advantage over local keys
if(keystate(DIR_U, &evt)){ // react on PRESS and both NONE/RELEASE if(keystate(DIR_U, &evt)){ // react on PRESS and both NONE/RELEASE
extsig = TRUE; extsig = TRUE;
if(evt == EVT_PRESS && uh != EVT_PRESS && uh != EVT_HOLD) newdir = MOTDIR_UP; if(evt == EVT_PRESS) newdir = MOTDIR_UP;
}else if(keystate(DIR_D, &evt)){ }else if(keystate(DIR_D, &evt)){
extsig = TRUE; extsig = TRUE;
if(evt == EVT_PRESS && dh != EVT_PRESS && dh != EVT_HOLD) newdir = MOTDIR_DOWN; if(evt == EVT_PRESS) newdir = MOTDIR_DOWN;
} }
if(evt == EVT_RELEASE || (extsig && evt == EVT_NONE)){ // EVT_NONE - released after short press - do nothing; EVT_RELEASE - after hold, stop if(evt == EVT_RELEASE || (extsig && evt == EVT_NONE)){ // EVT_NONE - released after short press - do nothing; EVT_RELEASE - after hold, stop
newdir = MOTDIR_STOP; newdir = MOTDIR_STOP;

View File

@ -64,7 +64,8 @@
#define DIR_U_PIN (1<12) #define DIR_U_PIN (1<12)
#define DIR_D_PIN (1<13) #define DIR_D_PIN (1<13)
// define BUTTONS_NEGATIVE if button pressed when ==1 // define BUTTONS_NEGATIVE if ALL button pressed when ==1
// (inversion of common buttons - by flag `inverted`)
#ifdef BUTTONS_NEGATIVE #ifdef BUTTONS_NEGATIVE
#define PRESSED(port, pin) ((port->IDR & pin) == pin) #define PRESSED(port, pin) ((port->IDR & pin) == pin)
#else #else

View File

@ -17,6 +17,7 @@
*/ */
#include "adc.h" #include "adc.h"
#include "buttons.h"
#include "can.h" #include "can.h"
#include "hardware.h" #include "hardware.h"
#include "proto.h" #include "proto.h"
@ -42,6 +43,7 @@ const char *helpmsg =
"'t' - get MCU temperature (*10)\n" "'t' - get MCU temperature (*10)\n"
"'u y xx' - turn on (xx==1) or off (xx==0) y (l/r) MOSFET\n" "'u y xx' - turn on (xx==1) or off (xx==0) y (l/r) MOSFET\n"
"'v' - get Vdd (*100)\n" "'v' - get Vdd (*100)\n"
"'B' - current buttons state\n"
"'M' - CAN bus monitoring on/off\n" "'M' - CAN bus monitoring on/off\n"
"'R' - software reset\n" "'R' - software reset\n"
"'T' - get time from start (ms)\n" "'T' - get time from start (ms)\n"
@ -111,6 +113,46 @@ static int startPWM(){
return TRUE; return TRUE;
} }
static const char* keyz[KEY_AMOUNT] = {
[HALL_D] = "Hall down",
[HALL_U] = "Hall up",
[KEY_D] = "Key down",
[KEY_U] = "Key up",
[DIR_D] = "Ext down",
[DIR_U] = "Ext up"
};
extern keybase allkeys[];
TRUE_INLINE void showbtnstate(){
for(int i = 0; i < KEY_AMOUNT; ++i){
usart_send(keyz[i]); usart_send(": ");
switch(keyevt(i)){
case EVT_PRESS:
usart_send("pressed");
break;
case EVT_HOLD:
usart_send("holded");
break;
case EVT_RELEASE:
usart_send("released after hold");
break;
default:
usart_send("none");
}
newline();
}
for(int i = 0; i < KEY_AMOUNT; ++i){
usart_send(keyz[i]); usart_send(": ");
keybase *k = &allkeys[i];
if(!PRESSED(k->port, k->pin)) usart_send("not ");
usart_send("pressed, ");
if(!k->inverted) usart_send("not ");
usart_send("inverted");
newline();
}
}
/** /**
* @brief cmd_parser - command parsing * @brief cmd_parser - command parsing
* @param txt - buffer with commands & data * @param txt - buffer with commands & data
@ -185,6 +227,9 @@ void cmd_parser(char *txt){
case 'v': case 'v':
usart_send("VDD="); usart_send(u2str(getVdd())); usart_send("VDD="); usart_send(u2str(getVdd()));
break; break;
case 'B':
showbtnstate();
break;
case 'M': case 'M':
flags.can_monitor = !flags.can_monitor; flags.can_monitor = !flags.can_monitor;
usart_send("CAN monitoring "); usart_send("CAN monitoring ");

View File

@ -1,2 +1,2 @@
#define BUILD_NUMBER "21" #define BUILD_NUMBER "27"
#define BUILD_DATE "2024-03-04" #define BUILD_DATE "2024-03-05"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject> <!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 12.0.2, 2024-03-04T19:10:32. --> <!-- Written by QtCreator 12.0.2, 2024-03-05T15:35:05. -->
<qtcreator> <qtcreator>
<data> <data>
<variable>EnvironmentId</variable> <variable>EnvironmentId</variable>