Steppers worked & tested; inner ADC works fine; add median filtering by 9 points for TRD resistance values

This commit is contained in:
eddyem 2015-04-22 12:26:54 +03:00
parent 2c87dc4af9
commit 9a1c26e368
4 changed files with 69 additions and 23 deletions

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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;