//******** Robot *************** // foreground thread, accepts data from producer // inputs: none // outputs: none void Robot(void){ unsigned long data; // ADC sample, 0 to 1023 unsigned long voltage; // in mV, 0 to 3000 unsigned long time = 0; // in 10msec, 0 to 1000 unsigned long t=0; unsigned int i; //OS_ClearMsTime(); char string[100]; DataLost = 0; // new run with no lost data OSuart_OutString(UART0_BASE, "Robot running..."); eFile_Create("Robot"); eFile_RedirectToFile("Robot"); OSuart_OutString(UART0_BASE, "time(sec)\tdata(volts)\n\r"); for(i = 1000; i > 0; i--){ t++; time+=OS_Time()/10000; // 10ms resolution in this OS while(!OS_Fifo_Get(&data)); // 1000 Hz sampling get from producer voltage = (300*data)/1024; // in mV sprintf(string, "%0u.%02u\t\t%0u.%03u\n\r",time/100,time%100,voltage/1000,voltage%1000); OSuart_OutString(UART0_BASE, string); } eFile_EndRedirectToFile(); OSuart_OutString(UART0_BASE, "done.\n\r"); Running = 0; // robot no longer running OS_Kill(); }
//******** Consumer *************** // foreground thread, accepts data from producer // calculates FFT, sends DC component to Display // inputs: none // outputs: none void Consumer(void){ unsigned long data,DCcomponent; // 10-bit raw ADC sample, 0 to 1023 unsigned long t; // time in ms unsigned long myId = OS_Id(); ADC_Collect(0, 1000, &Producer); // start ADC sampling, channel 0, 1000 Hz NumCreated += OS_AddThread(&Display,128,0); while(NumSamples < RUNLENGTH) { for(t = 0; t < 64; t++){ // collect 64 ADC samples data = OS_Fifo_Get(); // get from producer x[t] = data; // real part is 0 to 1023, imaginary part is 0 } cr4_fft_64_stm32(y,x,64); // complex FFT of last 64 ADC values DCcomponent = y[0]&0xFFFF; // Real part at frequency 0, imaginary part should be zero OS_MailBox_Send(DCcomponent); } OS_Kill(); // done }
//******** Consumer *************** // foreground thread, accepts data from producer // calculates FFT, sends DC component to Display // inputs: none // outputs: none void Consumer(void){ unsigned long data,DCcomponent; // 12-bit raw ADC sample, 0 to 4095 unsigned long t; // time in 2.5 ms unsigned long myId = OS_Id(); //ADC_Collect(5, FS, &Producer); // start ADC sampling, channel 5, PD2, 400 Hz //OS_DisableInterrupts(); ADC_Collect(5, FS, &Producer); // start ADC sampling, channel 5, PD2, 400 Hz //OS_EnableInterrupts(); NumCreated += OS_AddThread(&Display,128,0); while(NumSamples < RUNLENGTH) { PE2 = 0x04; for(t = 0; t < 64; t++){ // collect 64 ADC samples data = OS_Fifo_Get(); // get from producer x[t] = data; // real part is 0 to 4095, imaginary part is 0 } PE2 = 0x00; cr4_fft_64_stm32(y,x,64); // complex FFT of last 64 ADC values DCcomponent = y[0]&0xFFFF; // Real part at frequency 0, imaginary part should be zero OS_MailBox_Send(DCcomponent); // called every 2.5ms*64 = 160ms } OS_Kill(); // done }
//******** Robot *************** // foreground thread, accepts data from producer // inputs: none // outputs: none void Robot(void){ unsigned long data; // ADC sample, 0 to 1023 unsigned long voltage; // in mV, 0 to 3000 unsigned long time; // in 10msec, 0 to 1000 unsigned long t=0; OS_ClearMsTime(); DataLost = 0; // new run with no lost data printf("Robot running..."); eFile_RedirectToFile("Robot"); printf("time(sec)\tdata(volts)\n\r"); do{ t++; time=OS_MsTime(); // 10ms resolution in this OS data = OS_Fifo_Get(); // 1000 Hz sampling get from producer voltage = (300*data)/1024; // in mV printf("%0u.%02u\t%0u.%03u\n\r",time/100,time%100,voltage/1000,voltage%1000); } while(time < 1000); // change this to mean 10 seconds eFile_EndRedirectToFile(); printf("done.\n\r"); Running = 0; // robot no longer running OS_Kill(); }