MiniSTM32F103实现家庭普通电路中的电流谐波检测

本文介绍了作者如何使用MiniSTM32F103进行家庭电路电流谐波检测。通过配置TIM2、ADC和DMA进行数据采集,利用FFT算法处理数据,并寻找直流分量、基波和谐波。在实际采集过程中,使用开口式电流互感器并解决了火线零线合并及电流变比问题。
摘要由CSDN通过智能技术生成

前言:本人大二小白一个,通过一些小项目来充实下自己,不断学习,希望能与大家多多交流~

接下来主要分为代码设计和实际采集操作过程两部分来讲讲

代码设计

程序流程图

在这里插入图片描述
配置MiniSTM32的TIM2、ADC和DMA,利用TIM2产生矩形波,在上升沿触发ADC采集,可通过控制矩形波的周期来控制采样频率fs,然后由DMA把采集到的数据送入内存,共采集256个点。

配置TIM2、ADC和DMA

个人认为用库函数配置板子上的外设比较简单,把是什么、怎么用这两方面搞清楚就行了,可参考正点原子的教学视频。
代码如下:

#include "adc.h"

volatile uint16_t ADC_ConvertedValue[256];			//ADC采样的数据
u16 DMA1_MEM_LEN;
extern complex x[N];
#define ADC1_DR_Address    ((u32)0x4001244C)		//ADC1的地址

//TIM2配置,arr为重加载值,psc为预分频系数
void TIM2_Init(u16 arr,u16 psc)
{
   
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB2Periph_GPIOA, ENABLE); 		//时钟使能


    //定时器TIM2初始化
    TIM_TimeBaseStructure.TIM_Period = arr; 		//设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler =psc; 			//设置用来作为TIMx时钟频率除数的预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = 0; 		//设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 		//TIM向上计数模式
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);			//根据指定的参数初始化TIMx的时间基数单位

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;		//选择定时器模式:TIM脉冲宽度调制模式1
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;		//比较输出使能
    TIM_OCInitStructure.TIM_Pulse = 10;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;		//输出极性:TIM输出比较极性低
    TIM_OC2Init(TIM2, & TIM_OCInitStructure);		//初始化外设TIM2_CH2

    TIM_Cmd(TIM2, ENABLE); 			//使能TIM2
}

//DMA1配置
void DMA1_Config()
{
   
    DMA_InitTypeDef DMA_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);	  			//使能ADC1通道时钟

	DMA1_MEM_LEN = 256;
    //DMA1初始化
    DMA_DeInit(DMA1_Channel1);
    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;				//ADC1地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue; 		//内存地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; 				//方向(从外设到内存)
    DMA_InitStructure.DMA_BufferSize = 256; 						//传输的数据量
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; 		//外设地址固定
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; 			//内存地址固定
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord ; //外设数据单位
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord ;    //内存数据单位
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular  ; 		//DMA模式:循环传输
    DMA_InitStructure.
  • 9
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值