找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17476|回复: 19
收起左侧

基于STM32的交流电流测量系统(程序+电路资料全)

  [复制链接]
ID:440498 发表于 2019-6-3 19:50 | 显示全部楼层 |阅读模式
    本设计的整体结构大致有主控模块、电流信号采样模块、电源模块和串口输出模块组成,
   
本文中主控芯片采用型号为STM32F103RC的微控制器,在保证电流采样精度的前提下,使得结构尽可能的简洁,避免了复杂多变的电路布局,更加方便PCB板的制作,并且成本较为低廉。其中,在采样调理电路的设计中,采用电流互感器进行电流信号的采样。

电路原理图如下:
14.png

单片机源程序如下:
  1. #include  "Init.h"
  2. #include  "stdio.h"
  3. unsigned char flag=0;
  4. unsigned int  x;
  5. unsigned int  t;
  6. unsigned int m;
  7. void uart1_putc(unsigned char c)
  8. {
  9.   while(!(UART1_SR&(1<<6))&&(!(UART1_SR&(1<<7))));//判断状态的6.7位
  10.         //while(((UART1_SR>>6)&3)!=3);
  11.         UART1_DR=c;          // 数据传给数据寄存器,发送
  12. }

  13. int fputc(int ch,FILE *f)
  14. {
  15.         uart1_putc(ch);
  16.         return(ch);
  17. }
  18. void EXTI4_IRQHandler(void)
  19. {  
  20.            if(!( GPIOE_IDR&1<<4))
  21.                  {
  22.             delay_ms(5000);
  23.                         if(GPIOE_IDR&(1<<4))
  24.                                 if(EXTI_PR&(1<<4))
  25.                                 {
  26.                                         flag++;
  27.                                         if(flag==2)
  28.                                         flag=0;
  29.                                         EXTI_PR=1<<4;
  30.                                 }
  31.                  }                             
  32. }
  33. void TIM2_IRQHandler()     //TIM2中断处理函数
  34. {
  35.         if(TIM2_SR &1)//溢出中断
  36.         {
  37.                 flag=~flag;//把数据传给flag,flag接收.
  38.         }       
  39.           TIM2_SR &=0;//清除中断标志位   
  40. }
  41. void ADC1_2_IRQHandler ()     //中断处理函数
  42. {
  43.         //while(!(ADC1_SR&1<<1));lag
  44.         //flag=1;
  45.         //printf("中断开启  %d\r\n",flag);
  46.         x=ADC1_DR;
  47. }

  48.   int main(void)  
  49. {          float adcx;
  50.           float temp;
  51.           RCC_APB2ENR|=0x48;
  52.           GPIOB_CRL|=0X200000;
  53.                 GPIOE_CRL|=0X200000;  //灯的使能
  54.           RCC_APB2ENR|=0X8;             
  55.           GPIOB_CRH=3<<0;                         //蜂鸣器的使能
  56.     Stm32_Clock_Init(9);       //时钟初始化函数
  57.           Stm32_UART1_Int_Init();    //串口中断初始化函数
  58.           Stm32_Uart1_Init();                //串口初始化函数
  59.           Stm32_TIMER2_Int_Init();    //中断NVIC配置函数
  60.           Stm32_TIMER2_Init();       //定时器初始化函数
  61.           Stm32_Adc_Init();           //ADC初始化函数
  62.     Stm32_ADC1_Int_Init();      //ADC中断初始化函数
  63.           Stm32_Int_Init();           //按键初始化函数
  64.     printf("准备就绪!!!\r\n");        //Printf打印
  65.    while(1)
  66.     {
  67.                         // delay_ms(20000);
  68.                          ADC1_CR2|=1<<0;
  69.                          switch(flag)
  70.                          {
  71.                                    case 0:                              //绿灯亮
  72.                                          GPIOB_CRL&=(~(0x200000));        //按下按键KEY0直接到下一个模式
  73.                  GPIOE_CRL|=0X200000;
  74.                        GPIOE_ODR|=0x0000020;
  75.                        GPIOE_ODR&=(~(0x20));
  76.                                    printf("绿灯亮可以开始检测,请调到检测模式。\r\n");
  77.                              break;
  78.                                    case 1:
  79.                                       temp=x*(3.3/4096);
  80.                                             adcx=1.515*temp+0.7728;
  81.                                                   printf("输出采集电压值:  %.5f V\r\n",temp);
  82.                                             printf("输出采集电流值: %.5f A\r\n",adcx);
  83.                                     if(temp<=3)
  84.                                                 {
  85.               GPIOB_CRL|=0x200000;             //按下按键KEY0直接到下一个模式
  86.                     GPIOE_CRL|=0X200000;
  87.                           GPIOB_ODR|=0x20;
  88.                           delay_ms(5000);
  89.                           GPIOE_ODR&=(~(0x20));
  90.                           delay_ms(5000);
  91.                           GPIOB_ODR&=(~(0x20));
  92.                           delay_ms(5000);
  93.                           GPIOE_ODR|=0x20;
  94.                           delay_ms(5000);
  95.                                             printf("红绿灯亮 \r\n");
  96.                                                 }
  97.                        else
  98.                                          {
  99.                                           LED1|=0;LED2|=1;BEEP=0;
  100.                                                 printf("!!!请注意电压值,超过3.3V会烧坏你的开发板!!!\r\n");
  101.                                          }
  102.           break;                                                   
  103.                          }
  104.    }                                 
  105. }
复制代码

所有资料51hei提供下载:
交流电流测量系统.7z (54.93 KB, 下载次数: 607)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:440498 发表于 2019-6-3 20:17 | 显示全部楼层
实物电路图

18.png
17.jpg
回复

使用道具 举报

ID:328014 发表于 2019-6-7 04:52 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:106028 发表于 2019-6-11 08:39 | 显示全部楼层
不知效果如何,学些一下
回复

使用道具 举报

ID:573578 发表于 2019-6-27 18:36 | 显示全部楼层
能不能讲解一下外围电路,电流互感器只是转化电流大小,最后进入到stm32f103芯片进行AD转化时输入的是电压,那怎么办计算电流电压值,求助帮助
回复

使用道具 举报

ID:96913 发表于 2019-9-8 21:38 | 显示全部楼层
这个运放电路好像有问题,这是什么电路,峰值?平均值?貌似都不对啊
回复

使用道具 举报

ID:497733 发表于 2019-9-9 10:16 | 显示全部楼层
感谢分享,学习学习。。。。。
回复

使用道具 举报

ID:68875 发表于 2019-12-26 23:17 | 显示全部楼层
good topic,
回复

使用道具 举报

ID:412814 发表于 2020-1-19 21:01 | 显示全部楼层
谢谢楼主,学习了。
回复

使用道具 举报

ID:658039 发表于 2020-2-23 01:36 | 显示全部楼层
是取平均值?????????
回复

使用道具 举报

ID:511461 发表于 2020-7-31 11:03 | 显示全部楼层
adcx=1.515*temp+0.7728;
请问这句是什么意思?算出来的
回复

使用道具 举报

ID:810779 发表于 2020-8-3 11:32 | 显示全部楼层
你好,想质询一下你的电流采集系统的问题
回复

使用道具 举报

ID:28767 发表于 2020-8-7 13:57 | 显示全部楼层
good study         
回复

使用道具 举报

ID:214628 发表于 2020-9-17 10:25 | 显示全部楼层
adcx=1.515*temp+0.7728;
请问这句是什么意思?为什么乘以1.515,还要加上0.7728
回复

使用道具 举报

ID:563947 发表于 2020-11-20 06:27 | 显示全部楼层
有学习板买吗?
回复

使用道具 举报

ID:461677 发表于 2021-4-28 16:57 | 显示全部楼层
外围硬件的前级放大器部分是将电流传感器的微弱电流信号变换为电压信号,差分输入到前级放大器中,输出单端信号,然后经后级放大器放大后进行AD转换吗?
回复

使用道具 举报

ID:934633 发表于 2021-9-7 13:44 | 显示全部楼层
CH340G的收发接反了
回复

使用道具 举报

ID:928738 发表于 2021-11-29 15:49 | 显示全部楼层
STM32F103RC的微控制器没有PE引脚,代码和原理图不一致。需要修改
回复

使用道具 举报

ID:885182 发表于 2022-9-5 22:36 | 显示全部楼层
是可以测量有效值不
回复

使用道具 举报

ID:598178 发表于 2023-10-30 16:15 | 显示全部楼层
效果怎么样?有人验证过吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表