• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

求51单片机测交流电压的程序

stc12c5a60s2利用定时器中断测电压值  应该怎么样写程序  我写出的程序是比较法  换几个直流电还可以 交流电一直在闪屏 示数也不对………………  求指导
全部回复(8)
正序查看
倒序查看
2013-09-05 10:04
为何要用中断?
0
回复
2013-09-05 10:06
@贺赫无名
为何要用中断?

把AC电压再转成DC,再用AD转吧。

除非你是用外挂的AD,这个AD是必须能直接将AC转成有效值的二进制就可以

如电表用的芯片

0
回复
无衣
LV.6
4
2013-09-08 20:42

用单片机内的高速AD转换,用外中断找到过零点,测出半个周期内的N个电压值,然后求均方根值.用以上方法可以同时测频率和有效值.

0
回复
2013-09-09 08:18
@无衣
用单片机内的高速AD转换,用外中断找到过零点,测出半个周期内的N个电压值,然后求均方根值.用以上方法可以同时测频率和有效值.

你这样太耗MCU时间了。。STC的MCU速度是可以达100K,但你1秒就中断100次,还得采样几十次,对于显示肯定会有影响了。

   我用过片外串口总线的24位AD,速度需好等上mS才行哦。。。

0
回复
anges
LV.3
6
2013-09-12 16:41
@贺赫无名
你这样太耗MCU时间了。。STC的MCU速度是可以达100K,但你1秒就中断100次,还得采样几十次,对于显示肯定会有影响了。  我用过片外串口总线的24位AD,速度需好等上mS才行哦。。。
**此帖已被管理员删除**
0
回复
2013-09-19 07:23
@anges
**此帖已被管理员删除**

用AD采样吧

我是这样做的,我测量220V 50Hz交流电压有效值和有效功率

  

0
回复
2013-09-22 22:51

楼主 可以请教一下问题吗 就是这个单片机的ADC的编程问题和外围连接问题 我弄了一个这样的程序 不过好像有误差挺大的,还有那个外部的连接问题怎样改 加入我要测量超过5v的电压

#include "Text2.h"   //stc12c5a60s2头文件
#define uchar unsigned char
#define uint unsigned int
unsigned char data  adc_dat =0x30;
uchar ge,shi,shifen,baifen,qianfen;
float vin,R;
int  vins;
sbit dula=P3^6;
uchar code table[]={ 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};   //有小数点的
uchar code table1[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90} ; //没小数点的
void display(uchar shi,uchar ge,uchar shifen,uchar baifen,uchar qianfen);
void delay(uint z)          //延时子函数
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void main(void)
{
 unsigned long i;
 unsigned char status;
 ADC_CONTR|=0x80;  //打开AD转换电源
 for(i=0;i<10000;i++);  //延时
 P1ASF=0x04;     //选择通道P1.2转换
    ADC_CONTR=0xE2;   
 for(i=0;i<10000;i++);  //延时
    while(1)      //循环进行AD转换
 {
  ADC_CONTR|=0x08; //重新进行AD转换
  status=0;
  while(status==0)  //等待AD转换结束
  {
  
   status=ADC_CONTR&0x10;

  }
  ADC_CONTR&=0xE7;  //将ADC  FLAG清零
  adc_dat=ADC_RES;  //保存结果
  
       for(i=100;i>0;i--)   //转换100次
   {
    adc_dat=ADC_RES;
  
    R+=adc_dat;
    }
    R/=100.0;  //求平均值   
 
    vin=R*5.0/256;
  vin=vin*1000;
     vins=(int)vin;
  ge=vins/1000%10; // 分离数据
  shi=vins/1000/10;
  shifen=vins%1000/100;
  baifen=vins%1000%100/10;
  qianfen=vins%1000%100%10;
  display(shi,ge,shifen,baifen,qianfen);   
   
 }
}

void display(uchar shi,uchar ge,uchar shifen,uchar baifen,uchar qianfen)   
{
  dula=1;
  P2=0xfe;
  dula=0;
  dula=1;   
  P0=table1[shi];
  dula=0;
  delay(5);
  

  dula=1;
  P2=0xfd;
  dula=0;  
  dula=1;
  P0=table[ge];
  dula=0;
  delay(5);

  dula=1;
  P2=0xfb;
  dula=0;  
  dula=1;
  P0=table1[shifen];
  dula=0;
  delay(5);
  
  dula=1;
  P2=0xf7;
  dula=0;  
  dula=1;
  P0=table1[baifen];
  dula=0;
  delay(5); 

  dula=1;
  P2=0xef;
  dula=0;  
  dula=1;
  P0=table1[qianfen];
  dula=0;
  delay(5);
}

0
回复
mdbmhy
LV.1
9
2016-08-02 10:49
@pads2005pcb
用AD采样吧我是这样做的,我测量220V50Hz交流电压有效值和有效功率[图片]  

你好,我对你的这个方案感兴趣,可以转让吗

0
回复