//原理图大体是参考许剑伟老师的, 要飞条线, 把ADC1改接到12脚, 因为F303只能ADC1和2, 或者3和4同步采样. #include "misc.h" #include "platform.h" #include typedef struct {     unsigned short i, v; } sample_t;        // 单个采样点,32位的高16位和低16位分别是两个通道 static void sample(void)   {     __disable_irq();     DMA_Cmd(DMA1_Channel1, ENABLE);     while(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);     __enable_irq();     DMA_Cmd(DMA1_Channel1, DISABLE);     DMA_ClearFlag(DMA1_FLAG_TC1); } void LCR_DoMeasure(void) {     DataConfig_t* pdc = DC_Get();     sample_t* pbuf = (sample_t*)pdc->data.adc_buf;     float mean_v = 0, mean_i = 0, prod_i = 0, prod_q = 0, phase;     float abs_v = 0, abs_i = 0, z, x, r;     sample();     // 执行一次采样     int buf_size = sizeof(pdc->data.adc_buf) / sizeof(pdc->data.adc_buf[0]);     for(int i = 0; i < buf_size; i++) {         mean_v += pbuf[i].v;         mean_i += pbuf[i].i;     }     mean_v /= buf_size;     mean_i /= buf_size;         // 求平均值, 用于直流平衡 //这段代码是自相关求相位差?效果看起来不错啊     for(int i = 50; i < buf_size - 50; i++) {         prod_i += -(pbuf[i].v - mean_v) * (pbuf[i].i - mean_i);          // v和i做直流平衡后相乘, 累加得到同相分量         prod_q += (pbuf[i + 25].v - mean_v) * (pbuf[i].i - mean_i);    // 激励频率10k, 采样率1M, 每周期100个点, 因此移动25个点再平衡, 相乘, 累加就是正交分量了         abs_v += fabs(pbuf[i].v - mean_v);            // 绝对值求和         abs_i += fabs(pbuf[i].i - mean_i);     }     prod_i /= buf_size;     prod_q /= buf_size;     phase = atan2(prod_q, prod_i);              // 同相分量和正交分量, atan2即得到相位差     z = abs_v / abs_i;                                  // v和i绝对值相除得到阻抗绝对值, 再分别乘以相位差的cos和sin即得阻抗实部和虚部     r = 100 * z * cos(phase);     x = 100 * z * sin(phase);     printf("%f\n", phase * 180 / 3.141593);     if(phase >= 0)         printf("%f R + %.4e H\n", r, x / 2.0 / 3.141593 / 10e3);              // 相位差>0, 感抗, 否则为容抗     else         printf("%f R + %.4e F\n", r, -1 / x / 2.0 / 3.141593 / 10e3); }