Phatline Posted June 21, 2015 Report Share Posted June 21, 2015 (edited) i want the to adjust the exact RPM of my Blender (up to 37500 rpm) via a menu encoder i want to setup the exact hz, the code displays then the RPM value, the leds connected to a dout-module begin to flash the combinations of different Dout-pins to one LED give the led more Current... dont know up to know... maybe i need this. i now have to adjust the speed off the blender until the rotor seems to not moving anymore some basics? if (RPM==Blinkfrequency) {there will be No Motion} RPM=Rotation per minute 1minute has 60000ms RPms=Rotation per ms 1RPM is 60000RPms 38000RPM is 2280000000RPms u32 range is=4294967295 1hz = 60RPM 38000RPM = 633Hz so the maximal range of this strobo will be arround 640hz Frequency=1/Time Time=1/Frequency 1000hz = 1ms the protone resonance frequency of hydrogen (H) = 61779498184847720448 Hz the 58 Octave from this is 428.681 Hz taken from the free m.rauch software: http://aladin24.de/htm/res/index.php 428,681hz = 25720,86 RPM --- this is the speed i want to setup the mixer with water in it. Time= 1/428,681hz = 0,002161316s x 1000 = 2.1613ms that meens that void APP_Tick(void) is not accorate for this, since it is called evy 1ms the standart updaterate ot the void APP_SRIO_ServicePrepare(void){ //called before the shift register chain is scanned MIOS32_DOUT_PinSet( 0, LEDvalue[0]);} is 1,28uS which is accourate enough to handle the LED-Status u32=4294.967.295 wordlength. seco.milis.mikro I think thats enough so set up a timer @1uS rate: void APP_Init(void){ //initialize MIOS32_TIMER_Init(1, 1, Timer, MIOS32_IRQ_PRIO_LOW); //1uS Timer set then count (timecount) to a specific time... when reached: reset the counter, turn on the led... the counter now counts again a specific time until it reaches the decay--time-mark (here 100uS) now it turn off the LEDs ...now it counts forwarde to the specific time...reset the counter, turn on the led.... void Timer(){ timecount = timecount + 1; if (timecount >= time) {LEDvalue[0] = 1; timecount = 0;} if (timecount >= decaytime) {LEDvalue[0] = 0;}} next time some menus, encoders, display, and formulars... for what a ocataved protone resonancy frequency on water? hmm someone sayed that on this frequency the temperature drifts down and water got lost... i want to proove that! Edited June 22, 2015 by Phatline Quote Link to comment Share on other sites More sharing options...
Hawkeye Posted June 23, 2015 Report Share Posted June 23, 2015 You are positively insane, man! :phone: :phone: :phone: Have a great day! Peter Quote Link to comment Share on other sites More sharing options...
Phatline Posted June 26, 2015 Author Report Share Posted June 26, 2015 hmmm... the timer or the shiftregister update are not working as i want... i want a stable blink...instead, it sometimes some blinks dont accour... it looks like the counter overlaps with the shiftregister update or so...maybe it is a priority question --- any idea? here is the code: (attached is also the full project - it runs on a lp17 core with dio-shiftregisters connected-dout register 1 pin 0 is the blink-output... the din register 1 pin 0+1 = hz-encoder.... the used display is 2x40 signs...) #include <mios32.h> #include <FreeRTOS.h> #include <task.h> #include "tasks.h" #include "file.h" #include "app.h" #include <portmacro.h> #include <queue.h> #include <semphr.h> #include <string.h> #include "mios32_timer.h" #define NUM_ENCODERS 9 //5 Menue Encoders are connectet const mios32_enc_config_t encoders[NUM_ENCODERS] = {//(SR begin with 1, ENC with 0) // setup the Pinout of that Encoders { .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=4, .cfg.sr=1, .cfg.pos=0 }, //Menue Encoder 0 - only virtual, since they are mapped to differnt Variables... { .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=4, .cfg.sr=1, .cfg.pos=2 }, //Menue Encoder 1 - ...if "Menue Page Encoder" has changed { .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=4, .cfg.sr=1, .cfg.pos=4 }, //Menue Encoder 2 { .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=4, .cfg.sr=1, .cfg.pos=6 }, //Menue Encoder 3 { .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=4, .cfg.sr=2, .cfg.pos=0 }, //Menue Encoder 4 { .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=4, .cfg.sr=2, .cfg.pos=2 }, //Menue Encoder 5 { .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=4, .cfg.sr=2, .cfg.pos=4 }, //Menue Encoder 6 { .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=4, .cfg.sr=2, .cfg.pos=6 }, //Menue Encoder 7 { .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=4, .cfg.sr=3, .cfg.pos=0 },}; //Menue Page Encoder xSemaphoreHandle xLCDSemaphore; // take and give access to LCD u32 MenueUpdateCount = 0; u32 value = 0; //Encoder calculation... u32 i = 0; //Encoder calcualtion //WKS u32 hz = 428; u32 nm = 10; u32 rpm = 25680; u32 time = 2161; //setup timer time u32 timecount = 0; u32 hzcount = 0; u32 decaytime = 128; //Task Prioritys #define MUTEX_LCD_TAKE { while( xSemaphoreTakeRecursive(xLCDSemaphore, (portTickType)0) != pdTRUE ); } //a Mutex reserve a Resoure (LCD or SD-Card) for a task, until it is given away... #define MUTEX_LCD_GIVE { xSemaphoreGiveRecursive(xLCDSemaphore); } #define PRIORITY_StoreLoad ( tskIDLE_PRIORITY + 2 ) //3:Mios standart static void StoreLoad(u8 tick, u16 order); static void Timer(void); void APP_Init(void){ MIOS32_BOARD_LED_Init(0xffffffff); //initialize all LEDs xLCDSemaphore = xSemaphoreCreateRecursiveMutex(); //create Mutex for LCD access //initialize encoders i = counter for(i=0; i<NUM_ENCODERS; ++i) MIOS32_ENC_ConfigSet(i, encoders[i]); //initialize encoders MIOS32_TIMER_Init(1, 1, Timer, MIOS32_IRQ_PRIO_HIGH); //1uS Timer set MIOS32_SRIO_ScanNumSet(1); // limit the number of DIN/DOUT SRs which will be scanned for faster scan rate //speed up SPI transfer rate (was MIOS32_SPI_PRESCALER_128, initialized by MIOS32_SRIO_Init()) MIOS32_SPI_TransferModeInit(MIOS32_SRIO_SPI, MIOS32_SPI_MODE_CLK1_PHASE1, MIOS32_SPI_PRESCALER_64); // prescaler 64 results into a transfer rate of 1 uS per bit // when 2 SRs are transfered, we are able to scan the whole 16x8 matrix in 300 uS } void Timer(){ timecount = timecount + 1; if (timecount > time) {MIOS32_DOUT_PinSet( 0, 1); timecount = 0;} if (timecount > decaytime) {MIOS32_DOUT_PinSet( 0, 0);}} void APP_Background(void){} void APP_Tick(void) { //1ms Event Triggering MenueUpdateCount = MenueUpdateCount + 1; if(MenueUpdateCount > 650){MenueUpdateCount = 0; StoreLoad(0, 0);}} //update the Menue void APP_MIDI_Tick(void){} void APP_MIDI_NotifyPackage(mios32_midi_port_t port, mios32_midi_package_t midi_package){} void APP_SRIO_ServicePrepare(void){} void APP_SRIO_ServiceFinish(void){} void APP_DIN_NotifyToggle(u32 pin, u32 pin_value){} void APP_ENC_NotifyChange(u32 encoder, s32 incrementer){ if(encoder == 0){ value = hz + incrementer; // increment to virtual position and ensure that the value is in range 0..127 if(value < 0) {value = 999;} if(value > 999){value = 0;} hz = value; time = 1000000/hz; //we count in mikro Sekonds! rpm = hz * 60; } if(encoder == 2){ value = time + incrementer; // increment to virtual position and ensure that the value is in range 0..127 if(value < 0) {value = 3000;} if(value > 3000){value = 0;} time = value; hz = 1000000/time; rpm = hz * 60; } if(encoder == 4){ value = rpm + incrementer; // increment to virtual position and ensure that the value is in range 0..127 if(value < 0) {value = 100000;} if(value > 100000){value = 0;} rpm = value; hz = rpm / 60; time = 1000000/hz; } if(encoder == 7){ value = (incrementer * 2) + decaytime; // increment to virtual position and ensure that the value is in range 0..127 if(value < 0) {value = 99999;} if(value > 99999){value = 0;} decaytime = value; } } void APP_AIN_NotifyChange(u32 pin, u32 pin_value){ //AIN - - Potentiometer has mooved - - Analog InPut } static void StoreLoad(u8 tick, u16 order){ //Display MENUE, Store+Load Bank & Sys-Config if(tick == 0){//Menue MUTEX_LCD_TAKE; //request LCD access MIOS32_LCD_Clear(); //clear screen //1st Line = Encoder Variables....change something! MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString("%d", hz); MIOS32_LCD_CursorSet(10, 0); MIOS32_LCD_PrintFormattedString("%d", time); MIOS32_LCD_CursorSet(20, 0); MIOS32_LCD_PrintFormattedString("%d", rpm); MIOS32_LCD_CursorSet(35, 0); MIOS32_LCD_PrintFormattedString("%d", decaytime); //2nd Line = Menue Describtio MIOS32_LCD_CursorSet(0, 1); MIOS32_LCD_PrintFormattedString("%s", "hz"); MIOS32_LCD_CursorSet(10, 1); MIOS32_LCD_PrintFormattedString("%s", "usec"); MIOS32_LCD_CursorSet(20, 1); MIOS32_LCD_PrintFormattedString("%s", "rpm"); MIOS32_LCD_CursorSet(35, 1); MIOS32_LCD_PrintFormattedString("%s", "decay"); MUTEX_LCD_GIVE;}} // release LCD access for other tasks RPM_BLINK.zip Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.