Show Posts

Pages: 1 [2]

19

Using Arduino / General Electronics / Re: ac current meter using acs758 hall sensor

on: November 20, 2012, 05:20:48 am

damned paranthesis! later i will use #define or const for my code, code here is only for test purpose my new code has a simple filter for adc to remove offset uint16_t i = 0; int16_t adc_raw = 0; int16_t adc_rawlast = 0; int16_t adc_filtered = 0; int16_t adc_lastfiltered = 0; for(i=0; i<100; i++) { adc_rawlast = adc_raw; adc_raw = (512  adc_read(2)); adc_lastfiltered = adc_filtered; //digital high pass filters to remove offset. adc_filtered = 0.996*(adc_lastfiltered+adc_rawadc_rawlast); s = adc_filtered * adc_filtered; ssum += s; _delay_us(100); } d = sqrt(ssum/100) * 5 / (0.018 * 1024.0); ssum = 0; now with a sensitivity of 0.018 (0.036 (close to 0.04) /2) things seems right from 0.5A to 12A my chip is ACS758 LCB050B because d = sqrt(ssum/100) * 5 / (0.018 * 1024.0); is like d = 2 * sqrt(ssum/100) * 5 / (0.036 * 1024.0); isn't that there is a 2 multiply left?



21

Using Arduino / General Electronics / Re: ac current meter using acs758 hall sensor

on: November 20, 2012, 03:48:12 am

it's a 1500w hair dryer with three position (stop, 3.4A, 6.4A, as read by my multimeter, which is not true rms). i've also try attaching another heater, from 6.4A the current sucked it sine wave form BUT, and the extimated current measure is right IF i change the sensitivity A LOT. uint16_t i = 0; double sensitivity = 0.0016; int16_t adc_raw = 0; int16_t adc_zero = 512; //as read when there is no current on the load for(i=0; i<100; i++) { adc_raw = adc_read(2); l += (adc_raw  adc_zero)*(adc_raw  adc_zero); _delay_us(100); } d = (sqrt(l)/100) * 5 / (0.0016 * 1024.0)  0.5; l = 0; d = (sqrt(l)/100) * 5 / (0.0016 * 1024.0)  0.5; with sensitivity of 0.0016 and an offset of 0.5 i've almost right result on 0A and above 3.4A (tried only 6.4A / 8A / 12A) but from datasheet sensitivity is 0.04 ( = 25 * 0.0016)



22

Using Arduino / General Electronics / Re: ac current meter using acs758 hall sensor

on: November 19, 2012, 02:08:55 pm

l += pow(adc_raw  adc_zero, 2);
You don't want to use pow() here, it uses float, double and is far too slow (it does logarithms, antilogarithms). long val = adc_raw  adc_zero ; l += val * val ;
You need to be sampling the waveform at 1000Hz or more for good accuracy so its important the maths isn't too slow. Lose the delays  if you want to control the timing you should use millis() or micros() so you can synchronize to a multiple of 50 or 60Hz. First look at a set of raw values from the sensor to check they are what you'd expect (sample a bunch into an array, then print out the array, printing out is too slow also). You should see a clear sinusoidal pattern with the correct amplitude. Then test your calculation code with known correct raw values to see if the arithmetic is correct. attached a plot of raw values, just analogRead of the pin. it has a strange behavior+ the first part (y=512) is a line, device is power off. + the second part, some sort of 1/2 sine wave, only + part is present, device @ 3.4Amp, [strange here, why??] + the third part is a sine wave, device @ 6.4Amp sensor has the same circuit as the datasheet propose, it does not change if Cf and / or Rf are present or not.



23

Using Arduino / General Electronics / Re: ac current meter using acs758 hall sensor

on: November 19, 2012, 11:11:57 am

Almost. You need to convert (adc_raw  adc_zero) to type 'long' before you square it, because the square may exceed the range of an int. You will need to declare currentac with type 'long' too. After taking the sqrt, you need to adjust it for the sensitivity etc. just as you do for DC.
i've left all untyped i know typed code is below. i've tried two ways, but it doesn't seams to works. test 1 subtract the zerocurrent value (512 or thereabouts) from the raw readings, square that, and add it to an accumulator variable. When you have accumulated enough samples, take the square root if the accumulator and divide by the number of readings.
double d = 0; long l = 0; for(;;) { uint16_t i = 0; int16_t adc_raw = 0; int16_t adc_zero = 512; for(i=0; i<100; i++) { adc_raw = adc_read(2); l += pow(adc_raw  adc_zero, 2); _delay_us(100); } d = (sqrt(l)/100) * 5 / (0.04 * 1024.0); l = 0;
test 2 average the square of the current, and take the square root of the average
double c = 0, d = 0; for(;;) { uint16_t i = 0; int16_t adc_raw = 0; int16_t adc_zero = 512; for(i=0; i<100; i++) { adc_raw = adc_read(2); adc_raw = adc_raw  adc_zero; c += pow(adc_raw * 5 / (0.04 * 1024.0), 2); _delay_us(100); } d = sqrt(c)/100; c = 0; ... print c... } i'm testing a 6.4 Amp 220V 50hz device both code i obtain almost the same value, which is 0.27Amp, but is not correct



24

Using Arduino / General Electronics / Re: ac current meter using acs758 hall sensor

on: November 19, 2012, 09:49:03 am

The max value you can read is indeed 1023, but the correct value to use in the calulation is 1024. See section 24.7 of the atmega328p datasheet.
Thank you for this info! Are you trying to measure alternating current? If so, you need to average the square of the current, and take the square root of the average (that's what RMS means). Easiest way is to subtract the zerocurrent value (512 or thereabouts) from the raw readings, square that, and add it to an accumulator variable. When you have accumulated enough samples, take the square root if the accumulator and divide by the number of readings.
Yes ac current. so, for AC current something like this samplesnum = 100; adc_zero = 512; //as read when there is no current on the load sensitivity = 0.04; //as read from datasheet for(i=0; i<samplesnum ; i++) adc_raw = analogRead(1); currentacc += (adc_raw  adc_zero) * (adc_raw  adc_zero); //subtract the zerocurrent value (512 or thereabouts) from the raw readings, square that, and add it to an accumulator variable } currentac = sqrt(currentacc)/samplesnum; //take the square root if the accumulator and divide by the number of readings. for DC current something like this adc_zero = 512; //as read when there is no current on the load sensitivity = 0.04; //as read from datasheet currentdc = (adc_raw  adc_zero) * 5/(sensitivity * 1024) right?



25

Using Arduino / General Electronics / Re: ac current meter using acs758 hall sensor

on: November 19, 2012, 08:55:09 am

thank you for reply The value adcdiv in your calculation should be 1024, not 1023
reason for 1024, correct me if i'm wrong adcraw is a 10bit values, so from 0(min) to 1023(max = 2^101), so the max values here is 1023 A value of 512 with no current flowing is exactly right, however the device may have an offset of a few mV, so the value may be a few counts out. Noise on the +5V line will affect the reading.
which is the math to use for transform adc values to amepere using an acs758. i get adc samples for adc current making an avarage of "many" values, i.e. at least 2 times the period of my 50Hz primary current, and my adc values are stable. but maybe my formula is not correct, i'm using this one: amp = (adcraw*adcvref/adcdiv adcvref/2) / sensitivity; because with "small" adcraw changes i have "big" change in amp es. ( 512 *5/1023  5/2)/0.04 = 0.062 ( 516 *5/1023  5/2)/0.04 = 0.54 (1/2Amp!) and also consider the max raw value of 1023 ( 1023 *5/1023  5/2)/0.04 = 62.5 acs758050b is rated as 50Amp max, the max raw value i should read is almost 900



26

Using Arduino / General Electronics / ac current meter using acs758 hall sensor

on: November 19, 2012, 07:14:52 am

hello,
i'm trying to read ac current using a bidirection allegro hall sensor acs758050b i've a problem using it. when i do not connect anything to this sensor i read * a raw value of 516 with a input voltage of 4.80V +0.05V * a raw value of 512 with a input voltage of 4.70V +0.05V
to convert the value to current i use the current formula adcvref = 5 adcdiv = 1023 sensitivity = 0.04 ( acs758050b sensitivity datasheet) amp = (adcraw*adcvref/adcdiv adcvref/2) / sensitivity;
anyway the problem with the raw value persist, even if i change the reference (adcvref) current value to real adcvalue (4.80 or 4.70)
can anyone help me? thanks!



27

Using Arduino / Sensors / Re: MPU6050 gyro calibration

on: October 24, 2012, 07:13:24 am

The MPU6050 has a +/ 20 degrees/second tolerance for zero rate, but this is normal for any gyro chip.
You should be using the accelerometer readings in combination with the gyro for a zero point of reference.
thank you. the internal DMP of this chip should already combine gyro and accell, or i'm i wrong? i've made some screenshot of the behavior 16.50 / 19.20 / 20.50 time (chip is in the same position, i've not moved it)



28

Using Arduino / Sensors / MPU6050 gyro calibration

on: October 23, 2012, 07:10:11 am

hello, i'm playing with a mpu6050 micro i use the i2cdevlib mpu6050 library. i've a problem with the gyro even if the chip is not moving, i alwars read a small amount of gyro. @ 2000 deg/sec raw data on X axis is between 41 and 49, Y 13 and 7, Z 27 and 31 to prevent this error, i try to calibrate this by hand substracting ia middle value to the read data XOFFSET 42 / YOFFSET 9 / ZOFFSET 29 things goes better, but it always move a little, using DMP or mahony alghoritm. i've only 1 chip, so i can not test this with other mpu6050. is this a problem of my chip, or i've to calibrate the gyro, or i'm i wrong in other way. tks



29

Forum 20052010 (read only) / Italiano / Re: atmega senza arduino

on: January 23, 2009, 09:26:10 am

ciao a tutti, premetto che sono newbie di atmel e arduino, programmo solitamente su pic. visto che arduino è una prot. board per atmega168, mi chiedevo se il linguaggio C usato è lo stesso di quello avr studio (quello che penso sia "ufficile"... magari sto dicendo na cavolata però). volevo infatti capire se usando arduino, potrò in futuro: * utilizzare un compilatore diverso da quello fornito da arduino (avr studio o altri?) * programmare il chip con un programmatore esterno (eventualmente con un programmatore ISP) ... quindi in pratica usare il chip come stand alone (costruendoci un circuito minimale intorno naturalmente: alim, cristallo, in/out)
grazie, hOZONE



