mirror of
https://github.com/eddyem/stm32samples.git
synced 2025-12-06 18:55:13 +03:00
nothing works, 2 mosfets died...
This commit is contained in:
parent
1ecea45cc0
commit
c6e8347d23
@ -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
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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 ");
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
#define BUILD_NUMBER "21"
|
#define BUILD_NUMBER "27"
|
||||||
#define BUILD_DATE "2024-03-04"
|
#define BUILD_DATE "2024-03-05"
|
||||||
|
|||||||
Binary file not shown.
@ -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>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user