#include "display.h" #include "beep.h" #include "adc.h" #include "led.h" #include "timer.h" #include "stdint.h" #include "SysTick.h" #include "math.h" enum { VLOTAGE =0, CURREENT, }; #define CAIYANG (680) #define M_PI (3.1415926) #define VLAUE1 (880*1000 + CAIYANG) float read_voltage_v(uint16_t val) { float value = 0.0; uint32_t temp = 0; temp = val; temp *= 33; temp *= 1000; temp = temp >> 12; temp *= VLAUE1; value = temp; value /= 10.0; value /= CAIYANG; value /= 1000.0; // value /= 1.414213; return value; } float read_voltage_I(uint16_t val) { float value = 0.0; uint32_t temp = 0; temp = val; temp *= 33; temp *= 1000; temp = temp >> 12; temp *= 2000; value = temp; value /= 10.0; value /= 100.0; value /= 1000.0; // value /= 1.414213; return value; } extern uint8_t read_complete; uint8_t flash_led = 0; //float data_f[500]; //float data_c[500]; extern uint16_t data_s[500]; extern uint16_t data_i[500]; float value = 0.0; extern uint16_t count_v ; extern uint16_t count_i ; static float voltage_show = 0.0; static float current_show = 0.0; //float v_data[500] = {0}; static float calculate_voltage(uint16_t *data) { float val_v = 0.0; int h = 0; uint8_t flag = 0; int start = 0; int end = 0; // memset(v_data,0,sizeof(float)*500); for(int i = 0; i < 500;) { if(data[i] > 0) { start = i; if(i == 500 -1) break; for(int j = i+1;j < 500;j++) { if(data[j] > 0) { h++; if(j == (500-1)) { end = j; } }else { end = j; break; } } if(h < 2) { for(int k = start;k <= end;k++) data[k] =0; } h =0; i= (end+1); }else { i++; } } // if(count_v >=244) // { for(int j = 0; j < 500;j++) { if(data[j]) { float da = 0.0; da = read_voltage_v(data[j]); val_v += (da*da); }else { val_v += 0; } } // } val_v /= 500; val_v = sqrt(val_v); val_v /= 0.707; val_v /= 0.9904; return val_v; } static float calculate_current(uint16_t *data) { float val_v = 0.0; int h = 0; uint8_t flag = 0; int start = 0; int end = 0; for(int i = 0; i < 500;) { if(data[i] > 0) { start = i; if(i == 500 -1) break; for(int j = i+1;j < 500;j++) { if(data[j] > 0) { h++; if(j == (500-1)) { end = j; } }else { end = j; break; } } if(h < 2) { for(int k = start;k <= end;k++) data[k] =0; } h =0; i= (end+1); }else { i++; } } // memset(v_data,0,sizeof(float)*500); for(int j = 0; j < 500;j++) { float da = 0.0; if(data[j]) { da = read_voltage_I(data[j]); val_v +=(da*da); } } val_v /= 500; val_v = sqrt(val_v); val_v /= 0.707; val_v /= 0.9904; return val_v; } float show_val_1 =888.8; float show_val_2 =888.8; int main() { InitSysTick(); DelayNms(500); DisplayInit(); BeepInit(); AdcInit(); LedInit(); InitTimer(); while(!dma_flag_get(DMA_CH0,DMA_FLAG_FTF)); dma_flag_clear(DMA_CH0,DMA_FLAG_FTF); float voltage = 0.0; float cureent = 0.0; int index = 0; ADC_TimerEnable();; while(1) { display_voltage(show_val_2,show_val_1); if(flash_led) { led_flash(); flash_led = 0; if(read_complete == 1) { read_complete = 0; voltage_show += calculate_voltage(data_s); current_show += calculate_current(data_i); index++; ADC_TimerEnable(); if(index >= 5) { index = 0; show_val_2 = (voltage_show /5.0); voltage_show = 0; show_val_1 = (current_show /5.0); current_show = 0; } } //display_voltage(show_val_1,show_val_2); //show_val_2 = read_voltage(); } } }