cancel
Showing results for 
Search instead for 
Did you mean: 

Sonar like algorithm

raw_pix
Associate
Posted on November 07, 2015 at 16:45

Hi guys,

I am trying to read a sensor that is rotating, then record all the values through the ADC and I want the sensor to stop rotatin when it found the hishest value. Do you guys have any idea how to do that ? Below is the code that I have written so far. The sensor is rotating on a motor and I want it to stop once it read the hisgest value.

#include <
stm32f4xx.h
>
#include ''lcd.h''
#include ''pwm.h''
unsigned int my_array[1000];
//////// LCD DECIMAL VALUE DISPLAY ////////////////////////
void lcd_num (unsigned long int t)
{ 
// variables
float a=0;
float b=0;
float c=0;
float d=0;
unsigned long int Z=((t*3000)/4095);
// output 1st value
a=Z/1000 ;
LCD_DATA(l+48,TXT);

LCD_DATA('.',TXT);
//output 2nd value
b=(Z/100)%10;
LCD_DATA(i+48,TXT);
// output 3rd value
c= (Z/10)%10;
LCD_DATA(48+n,TXT);
// output 4th value
d= Z%10;
LCD_DATA(48+d,TXT);
LCD_DATA('V',TXT);
}
///////////////////////////////////////////////////////////
///////////////////////// ADC CONFIGURATION //////////////////////////
void ADC_init (void)
{
RCC->AHB1ENR |=((1u<<
3
)|(1u<<4)|(1u<<2)); //clock for ports D+E+C enabled
RCC->APB2ENR |=(1<<
8
); //clock for ADC1 enabled
//GPIO port pin set as analogue input
GPIOC->MODER|=(3<<
8
); //PC4 is set as analogue
//Select channel sequence
ADC1->SQR3|=14; // 1st conversion on channel 14 : operates on PC4)
ADC1->CR2|=0x01; // Turn on ADC
}
unsigned short int read_adc (void)
{
ADC1->CR2|=(1<<
30
); // start conversion by setting SWSTART bit
while(!(ADC1->SR&(1<<
1
))); // wait for EOC bit while it is not set
return ADC1->DR; // return value
}
///////////////////////////////////////////////////////////////////////////
/////////////////////////// PWM /////////////////////////////////
void init_pwm_pb5(void) //timer3, channel 2
{
RCC->AHB1ENR|= (1UL << 
1
); //GPIOB clock enable
GPIOB->MODER|= (2UL << (2*5)); //PB5 output
GPIOB->AFR[0]|= 0x200000; //AF is timer3
RCC->APB1ENR|=0x02; //timer3 clock enable
TIM3->CCMR1|=0x6000; // PWM mode 1:
TIM3->CCER|=0x010; // Capture compare 1 output enabled
TIM3->PSC=1000; // prescale
TIM3->ARR=84; // auto reload value : PWM PERIOD
TIM3->CNT=0; // zero counter
TIM3->CR1|=0x01; // Counter enabled
}
void led_pwm_pb5(int duty)
{
int period = 84;
duty = duty*period/100;
TIM3->CCR2=duty; // load capture/compare register : HI PULSE WIDTH
}
//////////////////////////////////////////////////////////////
/////////////////////////// MAIN /////////////////////////////////
int main(void)
{
unsigned int b;
unsigned int i;
unsigned int n;
RCC->AHB1ENR|= (1UL << 
1
); //GPIOB clock enable
GPIOB->MODER|= (2UL << (2*13)); //PB5 output
ADC_init () ;
init_pwm_pb5 () ; // Initialization for PB5 pin 
while(1)
{ 
for(i=1;i<
n
;++i) /* Loop to store largest number to arr[0] */
{
if(my_array[0]<my_array[i]) /* Change < to > if you want to find smallest element*/
my_array[0]=my_array[i];
}

for(b=999; b!=0; b--) my_array[b]=my_array[b-1]; 
my_array[0]=read_adc();
LCD_DATA(my_array[0], TXT);

GPIOB->ODR |= 0x2000; // Output pin for PB13 IN1 Enable 
TIM3->CCR2= 2048; // PWM PB5
} // braket for while(1)
} // braket for main 

1 REPLY 1
Nickname3482_O
Associate II
Posted on November 17, 2015 at 18:30

Hello,

this corner of the forum is meant to support Environmental Sensors from STmicroelectronics,

as such, we target a subset of products that are currently published and advertised from

ST through its web site.

From your description there is no detail on the model of sensor you are referring to and the

request focuses mainly on generic methodological aspects with no clear relationship with the

category of products that we manage in this section of the forum.

At any time, we'd be glad to help you whenever you will ask for support that is specific to

environmental sensors from ST.

With Regards,

Adalberto