NEW: Learning electronics? Ask your questions on the new Electronics Questions & Answers site hosted by CircuitLab.
Sensors, Actuators, and Robotics » Hall effect sensor - increasing speeds
January 13, 2013 by mcgroover |
Hi, I have set up a system for measuring bike wheel speed. It works well when the speed is low, but when I speed up the wheel, the microcontroller doesn't seem to pick up all the revolutions (maybe 1 in 5). I put a magnet on the wheel and set up the hall effect sensor (http://sensing.honeywell.com/product%20page?pr_id=45312) with my nerdkit. I set it up via the instructions: Middle pin going to ground, and a 750 ohm resistor across the other two pins. I am at a loss as to why speeding up the wheel makes the system fail. The switching capability of the sensor is 100KHz and I am measuring the voltage of the sensor on every microcontroller cycle (not using interrupts). I thought potentially I might need a pull up/pull down resistor, but I am not sure. Any ideas? |
---|---|
January 13, 2013 by JimFrederickson |
It would be helpful if there were some actual numbers associated in regards to your statement:
What is "the speed is low"? Those are subjective statements. Actual numbers would be helpful. How are you determining it is "missing revolutions"? Just because you are spinning faster, or do you have some other method of counting for testing purposes? Most likely the problem is a "coding problem". If you are getting any consistent readings from your ADC that seem to be what you expect the most likely the hardware is working. I would though:
These steps should help eliminate vibration as a potential problem, and give you a better understanding of what is happening physically. A graph/marks will also give you the ability to determine what your "timing" will be for detection of a range of RPM's. If anywhere in your code you are using any "delay_ms()" function calls look at those carefully. They could be causing problems. If you are updating your LCD Display Continuously, you should change that to update the display at some "timed interval", or otherwise determined interval. (A "timed interval" will require a time base of some sort.) The "primary purpose" of your code is to "count revolutions", displaying the results is a necessary but "secondary purpose". Your code should reflect that as well. If at some point in time you expect/plan to be able to do actual "RPM's" other than just "counting revolutions" you will need to implement a time base of some sort. That will require a timer and interrupt to do well. |
January 14, 2013 by Ralphxyz |
mcgroover, are you using the ADC or looking at pin change? And like Jim asked how are you "timing" your revolutions? Ralph |
January 17, 2013 by Keyster |
Hey Groov, i have not used the ADC in a while but if memory serves it is not an instantaneous reading. once you fire it off your program "waits" for it to take numerous readings and then it averages them and then spits the answer out. this may be the the delay you are having problems with. i wrote a Bicycle POV a while back and just used the interrupt to take the reading and it never missed a beat. if you are totally not wanting to use interrupts then you could just watch for a PIN change and take your reading each time it does. i would say the only time you would use the ADC with a HALL Effect sensor is if you needed to know the distance the magnet is from the sensor (and you had a sensor that worked like that). on my POV i used rare earth magnets that i ordered from somewhere in china (probably DealExtreme) and i did not have to get the magnet very close to the sensor at all. they are about half the size of a dime and twice as thick. if you want to check it out go over to www.bryankey.com and click on the electronics page. Bryan |
January 27, 2013 by mcgroover |
Hi all, Thanks for your replys and apologies for my late reply. So to clarify a few things:
I did an interesting experiment that might help solve this. If I just agitate the wheel when the magnet is near the sensor, it does pick up all of the detections at a higher "RPM" (even though the wheel itself is not going through a full revolution). What this tells me is that the system is capable of picking up increasing RPM speeds (which I think could eliminate coding (?)), but has trouble when the linear speed of the magnet increases. I am wondering whether the sensor needs a stronger magnetic force when the magnet passes by faster in order to detect it and maybe I need the rare earth magnets Bryan suggests. I guess the only other factor is that higher linear speeds also means an increase in vibrations. The reason why I feel the vibrations shouldn't matter is that the sensor can switch when the magnets are within about 7mm and my setup has the magnet about 2mm from the sensor, so I wouldn't expect vibrations to move it 5mm back and forth. Thanks for your input! |
January 27, 2013 by mcgroover |
Bryan, are these the sort of ones you used? http://dx.com/p/super-strong-rare-earth-re-magnets-15mm-x-1mm-10-pack-10303 Nice project. The whole POV concept is very cool. |
January 27, 2013 by JimFrederickson |
The reasons that I thought you were using the ADC are when you posted:
Technically what you are doing is not "measuring voltage", but rather you are "measuring/reading/checking the logic level". (Either a "0" or a "1"...) You should also "track revolutions", at least during your debugging period. More
information is almost always more helpful than "less information". Also since you are
only viewing "processed information" there could be some issue regarding your algorithm. What is "speed" to your application? "Speed", is by definition the "rate of motion"... Your "speed measurement" is:
"inches/second", Also in order to calculate "speed" you need to have a "timebase". Where is this "timebase" coming from? You had said "I am not using any interrupts", is that true or did you just mean in the
reading of the Hall Affect Sensor? Are you using an interrupt to generate your "timebase"? I think I would get rid of your "750 ohm resistor" and just use the "internal pull-up on
your I/O pin". The Hall Affect Sensor you are using is already grounding your I/O
through it's output pin so the internal pull-up on the Atmel Microcontroller should work
without problems. (One less component to be concerned about.) It doesn't sound like vibration is an issue, but your could temporarily mount your hall
affect senor, or the magnet, on some folded over tape. (Whichever of those 2 components
that is stationary...) That way that tape can side over the other component and the
affects of vibration would be reduced for testing purposes. You wouldn't be able to run
longterm that way, well maybe with mylar you could, but for testing it could be helpful. Is your I/O from the Hall Affect Sensor "debounced and validated"? (Well probably |
January 28, 2013 by Keyster |
Hey McGroover, i am not sure if that is the same magnets, i am at work right now but will measure them when i get home tonight and post results. those look much larger in the picture BUT if they fit your situation and are very strong (which rare earth ones usually are) they should work fine. i was thinking more about your problem. are you displaying the speed on an LCD screen or something like that? if so, i have run into problems where the LCD display slows things down tremendously (in CPU time anyway). if this is the case here is what i would do, in fact, i would probably do this anyway just to "know for sure". turn off the display, in other words don't display any information. just blink an LED when the magnet is detected. maybe toggle it. turn it on the first time around and then turn it off the second time around, etc. this will tell you if you are missing a "detect" or if something in the code is going bad. if you go back and look at my video you can see that I blink an LED every time my board passes the magnet. i originally did this so i would know when it was firing but just left it because i liked it being there as a "magnet marker". like Jim asks; are you using an Interrupt to capture the time per revolution? if not, how are you getting the time without an interrupt? |
January 28, 2013 by Keyster |
hey McGroover, the magnets i used with that project are 8mm diameter and 3mm thick. i also went to dealextreme and checked my orders all the way back to 2009 and did not see any magnets in the list so i must have got them somewhere else. heck, i may have picked them up at Radio Shack a long time ago. the main thing i would do is try blinking the LED like i mentioned earlier. since there is (virtually) no lag in that it will help narrow down the timing problem. bryan |
March 06, 2013 by BStory |
Maybe you could put a magnet on each side of the wheel to help with the balance. Account for that in code. Also, I agree with Jim that tracking the revolutions would be a good idea. It would be impossible to count the wheel rotations but you could count the peddle rotations and find the wheel to peddle ratio. You could slowly spin the peddle 1 or 5 or however amount of rotations and count how many full rotations the wheel makes. So if you spin the peddle 1 full rotation and the wheel spins 8.6 times, just multiply your peddle rotation count by 8.6. You know it's working right when your count is pretty close to your measured rotations. If you use the 750 Ohm and the internal pullup resistor, the total resistance will actually be a little smaller than 750 Ohms because they are in parallel... I don't really know that it matter anyway but the datasheet for your sensor, in the wiring design that doesn't use the pnp transistor, recommends 10k Ohm between VCC and your pin. There are quite a few different applications on that sheet. According to the sheet, when it activates it pulls the pin low(Am I reading that right?). Using a pnp transistor might not be a bad idea. At the least, keep in mind that the line is at +5V in it's idle state and pulses to 0V when the sensor activates. |
Please log in to post a reply.
Did you know that NerdKits make a great gift? Learn more...
|