AC current sensor

Dependencies:   mbed

main.cpp

Committer:
okini3939
Date:
2011-01-16
Revision:
0:08313411c8a1

File content as of revision 0:08313411c8a1:

#include "mbed.h"
#include <math.h>

Ticker ticker;
volatile long val;
volatile int offset, count;

DigitalOut myled(LED1);
AnalogIn adc_offset(p15), adc_watt1(p16), adc_watt3(p18);
Serial pc(USBTX, USBRX); 

void sample_watt () {
    int i;

    i = ((adc_watt3.read_u16() >> 4) & 0x0fff) - offset;
    if (i < -1 || i > 1) {
        val = val + (i * i);
    }
    count ++;
}

int main() {
    float v, f, g;

    offset = (adc_offset.read_u16() >> 4) & 0x0fff;
    val = 0;
    count = 0;

    ticker.attach_us(&sample_watt, 100); // 10kHz
    pc.printf("begin\r\n");

    while(1) {
        if (count >= 10000) {
            myled = 1;
            // RMS
            __disable_irq();
            v = sqrt((float)val / count) * (3.3 / 0x1000);
            f = v / (0.99 * 330.0 / 3000.0);
            val = 0;
            count = 0;

            g = ((adc_watt1.read_u16() >> 4) & 0x0fff) - offset;
            g = g * (3.3 / 0x1000);
            g = g / (0.99 * 330.0 / 3000.0); 

            offset = (adc_offset.read_u16() >> 4) & 0x0fff;
            __enable_irq();

            pc.printf("%.2f A ave , ", g);
            pc.printf("%.2f A rms\r\n", f);

            myled = 0;
        }
    }
}