mirror of
https://github.com/eddyem/IR-controller.git
synced 2025-12-06 10:45:15 +03:00
Steppers worked & tested; inner ADC works fine; add median filtering by 9 points for TRD resistance values
This commit is contained in:
parent
2c87dc4af9
commit
9a1c26e368
@ -45,7 +45,9 @@
|
|||||||
* U10 -> 0 PA0
|
* U10 -> 0 PA0
|
||||||
*/
|
*/
|
||||||
uint8_t adc_channel_array[16] = {9,8,15,14,7,6,5,4,1,0};
|
uint8_t adc_channel_array[16] = {9,8,15,14,7,6,5,4,1,0};
|
||||||
volatile uint16_t ADC_value[ADC_CHANNELS_NUMBER]; // ADC DMA value
|
// ADC_value array have 9 records for each value for ability of median filtering
|
||||||
|
// values for channel num are ADC_value[num + ADC_CHANNELS_NUMBER*i]
|
||||||
|
volatile uint16_t ADC_value[ADC_CHANNELS_NUMBER*9]; // ADC DMA value
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Configure SPI ports
|
* Configure SPI ports
|
||||||
@ -164,7 +166,7 @@ void adc_dma_on(){
|
|||||||
dma_channel_reset(DMA1, DMA_CHANNEL1);
|
dma_channel_reset(DMA1, DMA_CHANNEL1);
|
||||||
DMA1_CPAR1 = (uint32_t) &(ADC_DR(ADC1));
|
DMA1_CPAR1 = (uint32_t) &(ADC_DR(ADC1));
|
||||||
DMA1_CMAR1 = (uint32_t) ADC_value;
|
DMA1_CMAR1 = (uint32_t) ADC_value;
|
||||||
DMA1_CNDTR1 = ADC_CHANNELS_NUMBER;
|
DMA1_CNDTR1 = ADC_CHANNELS_NUMBER * 9; // *9 for median filtering
|
||||||
DMA1_CCR1 = DMA_CCR_MINC | DMA_CCR_PSIZE_16BIT | DMA_CCR_MSIZE_16BIT
|
DMA1_CCR1 = DMA_CCR_MINC | DMA_CCR_PSIZE_16BIT | DMA_CCR_MSIZE_16BIT
|
||||||
| DMA_CCR_CIRC | DMA_CCR_PL_HIGH | DMA_CCR_EN;
|
| DMA_CCR_CIRC | DMA_CCR_PL_HIGH | DMA_CCR_EN;
|
||||||
adc_enable_dma(ADC1);
|
adc_enable_dma(ADC1);
|
||||||
@ -253,20 +255,37 @@ int power_voltage(){
|
|||||||
return (int)val;
|
return (int)val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This is some data for optimal median filtering of array[9]
|
||||||
|
uint16_t temp;
|
||||||
|
#define PIX_SORT(a,b) { if ((a)>(b)) PIX_SWAP((a),(b)); }
|
||||||
|
#define PIX_SWAP(a,b) { temp=(a);(a)=(b);(b)=temp; }
|
||||||
|
uint16_t p[9]; // buffer for median filtering
|
||||||
|
uint16_t opt_med9(){
|
||||||
|
PIX_SORT(p[1], p[2]) ; PIX_SORT(p[4], p[5]) ; PIX_SORT(p[7], p[8]) ;
|
||||||
|
PIX_SORT(p[0], p[1]) ; PIX_SORT(p[3], p[4]) ; PIX_SORT(p[6], p[7]) ;
|
||||||
|
PIX_SORT(p[1], p[2]) ; PIX_SORT(p[4], p[5]) ; PIX_SORT(p[7], p[8]) ;
|
||||||
|
PIX_SORT(p[0], p[3]) ; PIX_SORT(p[5], p[8]) ; PIX_SORT(p[4], p[7]) ;
|
||||||
|
PIX_SORT(p[3], p[6]) ; PIX_SORT(p[1], p[4]) ; PIX_SORT(p[2], p[5]) ;
|
||||||
|
PIX_SORT(p[4], p[7]) ; PIX_SORT(p[4], p[2]) ; PIX_SORT(p[6], p[4]) ;
|
||||||
|
PIX_SORT(p[4], p[2]) ; return(p[4]) ;
|
||||||
|
}
|
||||||
|
#undef PIX_SORT
|
||||||
|
#undef PIX_SWAP
|
||||||
/**
|
/**
|
||||||
* Resistance of TRD
|
* Resistance of TRD with median filtering
|
||||||
* @param num - number of sensor
|
* @param num - number of sensor
|
||||||
* @return R*100
|
* @return R*100
|
||||||
* we measure
|
|
||||||
*/
|
*/
|
||||||
int TRD_value(uint8_t num){
|
int TRD_value(uint8_t num){
|
||||||
uint32_t v = ADC_value[num];
|
int i, addr = num;
|
||||||
|
for(i = 0; i < 9; i++, addr+=ADC_CHANNELS_NUMBER) // first we should prepare array for optmed
|
||||||
|
p[i] = ADC_value[addr];
|
||||||
|
uint32_t v = opt_med9();
|
||||||
uint32_t r = v * ADC_multipliers[num];
|
uint32_t r = v * ADC_multipliers[num];
|
||||||
r /= (uint32_t)(4096 - v) * ADC_divisors[num];
|
r /= (uint32_t)(4096 - v) * ADC_divisors[num];
|
||||||
return (int) r;
|
return (int) r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint16_t tim2_buff[TIM2_DMABUFF_SIZE];
|
uint16_t tim2_buff[TIM2_DMABUFF_SIZE];
|
||||||
uint16_t tim2_inbuff[TIM2_DMABUFF_SIZE];
|
uint16_t tim2_inbuff[TIM2_DMABUFF_SIZE];
|
||||||
int tum2buff_ctr = 0;
|
int tum2buff_ctr = 0;
|
||||||
|
|||||||
@ -97,8 +97,10 @@ void ADC_calibrate_and_start();
|
|||||||
#define MOTOR_TIM1_PIN (GPIO6)
|
#define MOTOR_TIM1_PIN (GPIO6)
|
||||||
#define MOTOR_TIM2_PORT (GPIOD)
|
#define MOTOR_TIM2_PORT (GPIOD)
|
||||||
#define MOTOR_TIM2_PIN (GPIO15)
|
#define MOTOR_TIM2_PIN (GPIO15)
|
||||||
// don't even try to move motor if motors' voltage less than 9.5V
|
// don't even try to move motor if motors' voltage less than 9.0V
|
||||||
#define MOTORS_VOLTAGE_THRES (950)
|
#define MOTORS_VOLTAGE_THRES (900)
|
||||||
|
// stop all motors if voltage less than 7.5V
|
||||||
|
#define MOTORS_VOLTAGE_ALERT (750)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* One Wire interface
|
* One Wire interface
|
||||||
|
|||||||
@ -241,6 +241,8 @@ shutter_state shutter_init(){
|
|||||||
// gpio_set(SHUTTER_EXT_PORT, SHUTTER_CAM_PIN | SHUTTER_MAN_PIN | SHUTTER_FBSW_PIN); // turn on pull up
|
// gpio_set(SHUTTER_EXT_PORT, SHUTTER_CAM_PIN | SHUTTER_MAN_PIN | SHUTTER_FBSW_PIN); // turn on pull up
|
||||||
//DBG("shutter fb ready\n");
|
//DBG("shutter fb ready\n");
|
||||||
shutter_off();
|
shutter_off();
|
||||||
|
camera_pin_old_state = (gpio_get(SHUTTER_EXT_PORT, SHUTTER_CAM_PIN)) ? 1 : 0;
|
||||||
|
manual_pin_old_state = (gpio_get(SHUTTER_EXT_PORT, SHUTTER_MAN_PIN)) ? 1 : 0;
|
||||||
//shutter_timer_fn = NULL;
|
//shutter_timer_fn = NULL;
|
||||||
shutter_wait_block(SHUTTER_OP_DELAY, shutter_test);
|
shutter_wait_block(SHUTTER_OP_DELAY, shutter_test);
|
||||||
return SHUTTER_INITIALIZED; // we return this state in spite of the shutter isn't really initialized yet
|
return SHUTTER_INITIALIZED; // we return this state in spite of the shutter isn't really initialized yet
|
||||||
@ -270,9 +272,7 @@ void process_shutter(){
|
|||||||
man_pin_state = (gpio_get(SHUTTER_EXT_PORT, SHUTTER_MAN_PIN)) ? 1 : 0;
|
man_pin_state = (gpio_get(SHUTTER_EXT_PORT, SHUTTER_MAN_PIN)) ? 1 : 0;
|
||||||
// to avoid opening shutter if user forget to set manual switch to "closed" position
|
// to avoid opening shutter if user forget to set manual switch to "closed" position
|
||||||
// all operations with manual switch processed only in changing state of the switch
|
// all operations with manual switch processed only in changing state of the switch
|
||||||
if(manual_pin_old_state == -1){ // refresh manual pin state
|
if(manual_pin_old_state != man_pin_state){ // user changed switch state -> open/close
|
||||||
manual_pin_old_state = man_pin_state;
|
|
||||||
}else if(manual_pin_old_state != man_pin_state){ // user changed switch state -> open/close
|
|
||||||
manual_pin_old_state = man_pin_state;
|
manual_pin_old_state = man_pin_state;
|
||||||
//changed_manually = 1;
|
//changed_manually = 1;
|
||||||
if(man_pin_state){ // close
|
if(man_pin_state){ // close
|
||||||
|
|||||||
@ -189,27 +189,47 @@ uint8_t check_ep(uint8_t num){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Move motor Motor_number to User_value steps
|
* test 12V voltage
|
||||||
* return 0 if motor is still moving
|
* if it is less than MOTORS_VOLTAGE_THRES, return 1 & show err message
|
||||||
|
* else return 0
|
||||||
*/
|
*/
|
||||||
uint8_t move_motor(uint8_t num, int32_t steps){
|
uint8_t undervoltage_test(int thres){
|
||||||
uint8_t curpos, negative_dir = 0;
|
|
||||||
if(steps == 0) return 0;
|
|
||||||
// check whether motor is moving
|
|
||||||
if(Motor_active[num]){
|
|
||||||
ERR("moving\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
int voltage = power_voltage();
|
int voltage = power_voltage();
|
||||||
if(voltage < MOTORS_VOLTAGE_THRES){
|
if(voltage < thres){
|
||||||
ERR("undervoltage!\n");
|
ERR("undervoltage!\n");
|
||||||
if(mode == LINE_MODE){
|
if(mode == LINE_MODE){
|
||||||
P("[ " STR_MOTORS_VOLTAGE " ", lastsendfun);
|
P("[ " STR_MOTORS_VOLTAGE " ", lastsendfun);
|
||||||
print_int(voltage, lastsendfun);
|
print_int(voltage, lastsendfun);
|
||||||
P(" ]\n", lastsendfun);
|
P(" ]\n", lastsendfun);
|
||||||
}
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Move motor Motor_number to User_value steps
|
||||||
|
* return 0 if motor is still moving
|
||||||
|
*/
|
||||||
|
uint8_t move_motor(uint8_t num, int32_t steps){
|
||||||
|
uint8_t curpos, negative_dir = 0, N_active_in_group = 0;
|
||||||
|
if(steps == 0) return 0;
|
||||||
|
// check whether motor is moving
|
||||||
|
/* if(Motor_active[num]){
|
||||||
|
ERR("moving\n");
|
||||||
|
return 0;
|
||||||
|
}*/
|
||||||
|
// don't move motors if there's no power enough
|
||||||
|
if(undervoltage_test(MOTORS_VOLTAGE_THRES)) return 0;
|
||||||
|
if(num < 4){
|
||||||
|
for(curpos = 0; curpos < 4; curpos++)
|
||||||
|
if(Motor_active[curpos]) N_active_in_group++;
|
||||||
|
}else{
|
||||||
|
if(Motor_active[3] || Motor_active[4]) N_active_in_group = 1;
|
||||||
|
}
|
||||||
|
if(N_active_in_group){ // we can't move: there's any active motor in group
|
||||||
|
ERR("moving\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifdef EBUG
|
#ifdef EBUG
|
||||||
@ -330,6 +350,11 @@ void process_stepper_motors(){
|
|||||||
for(i = startno[j]; i < stopno[j]; i++)
|
for(i = startno[j]; i < stopno[j]; i++)
|
||||||
if(Motor_active[i]) is_active = 1;
|
if(Motor_active[i]) is_active = 1;
|
||||||
if(!is_active) continue; // don't generate clock pulses when there's no moving motors
|
if(!is_active) continue; // don't generate clock pulses when there's no moving motors
|
||||||
|
if(undervoltage_test(MOTORS_VOLTAGE_ALERT)){ // UNDERVOLTAGE! Stop all active motors
|
||||||
|
for(i = 0; i < 5; i++)
|
||||||
|
if(Motor_active[i]) stop_motor(i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
gpio_toggle(ports[j], pins[j]); // change clock state
|
gpio_toggle(ports[j], pins[j]); // change clock state
|
||||||
if(!gpio_get(ports[j], pins[j])){ // negative pulse - omit this half-step
|
if(!gpio_get(ports[j], pins[j])){ // negative pulse - omit this half-step
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user