找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5245|回复: 6
收起左侧

我用九齐MCU芯片做adc测交流电电压,测出来的电压值在一直变化

[复制链接]
ID:495949 发表于 2019-9-20 11:15 | 显示全部楼层 |阅读模式
51hei图片20190920111015.png

这个是电路图  下边是我的程序  大佬帮帮忙  万分感谢
  1. #include <at8.h>
  2. #include "at8_constant.h"

  3. unsigned int v,ge,shi,bai;
  4. unsigned int R_AIN1_DATA_HB;        
  5. unsigned int R_AIN1_DATA_LB;
  6. unsigned int ADC_DATA;

  7. #define UPDATE_REG(x)        __asm__("MOVR _" #x ",F")
  8. #define A PORTAbits.PA0
  9. #define B PORTAbits.PA4
  10. #define C PORTAbits.PA7
  11. #define D PORTBbits.PB3
  12. #define E PORTBbits.PB1
  13. #define F PORTAbits.PA1
  14. #define G PORTAbits.PA6
  15. #define DP PORTAbits.PA5
  16. #define W1 PORTBbits.PB0
  17. #define W2 PORTAbits.PA2
  18. #define W3 PORTAbits.PA3


  19. void display(unsigned int i);
  20. void weixuan();

  21. //! interrupt service routine
  22. void isr(void) __interrupt(0)
  23. {
  24.         ADRbits.ADIF = 0;
  25.         R_AIN1_DATA_HB = ADD;
  26.         R_AIN1_DATA_LB = 0x0F & ADR;
  27.         ADMDbits.START = 1;  
  28. }

  29. void main(void)
  30. {
  31. //    R_AIN1_DATA_HB=R_AIN1_DATA_LB=0x00;
  32.   //----- Initial GPIO-----
  33.     IOSTA = 0x00;                              
  34.     IOSTB = 0X04;
  35.     PORTA = 0xFF;                                            
  36.     PORTB = 0xFF;
  37.     INTE  = 0x00;                                             
  38. //----- Initial ADC-----         
  39.         ADMD  = C_ADC_En | C_ADC_CH_Dis | C_ADC_PB2 ;     
  40.         ADVREFH = C_Vrefh_2V;                                       
  41.         ADR         = C_Ckl_Div1;                                                
  42.          ADCR  = C_Sample_8clk | C_12BIT;               
  43.         PACON = C_PB2_AIN7;                                            
  44.         ADMDbits.GCHS = 1;                                             
  45.         ADRbits.ADIF = 0;                                               
  46.         ADRbits.ADIE = 1;                                            
  47.         ADMDbits.START = 1;                                                
  48.         ENI();                 
  49.     while(1)
  50.     {
  51.              while(ADMDbits.EOC==0);
  52.              ADC_DATA = ((unsigned int)R_AIN1_DATA_HB << 4 )+ R_AIN1_DATA_LB;
  53.             v=(unsigned int)ADC_DATA/10;
  54.             ge = v%10;
  55.            shi = v/10%10;
  56.            bai = v/100%10;
  57.            weixuan();
  58.     }
  59. }
  60. void display(unsigned int i)
  61. {
  62.         switch(i)
  63.         {
  64.                 case 0:A=0;B=0;C=0;D=0;E=0;F=0;G=1;DP=1;break;
  65.                 case 1:A=1;B=0;C=0;D=1;E=1;F=1;G=1;DP=1;break;
  66.                 case 2:A=0;B=0;C=1;D=0;E=0;F=1;G=0;DP=1;break;
  67.                 case 3:A=0;B=0;C=0;D=0;E=1;F=1;G=0;DP=1;break;
  68.                 case 4:A=1;B=0;C=0;D=1;E=1;F=0;G=0;DP=1;break;
  69.                 case 5:A=0;B=1;C=0;D=0;E=1;F=0;G=0;DP=1;break;
  70.                 case 6:A=0;B=1;C=0;D=0;E=0;F=0;G=0;DP=1;break;
  71.                 case 7:A=0;B=0;C=0;D=1;E=1;F=1;G=1;DP=1;break;
  72.                 case 8:A=0;B=0;C=0;D=0;E=0;F=0;G=0;DP=1;break;
  73.                 case 9:A=0;B=0;C=0;D=0;E=1;F=0;G=0;DP=1;break;
  74.         }
  75. }

  76. void weixuan()
  77. {
  78.         unsigned int i,j;
  79.         while(1)
  80.         {
  81.         for(i=0;i<3;i++)
  82.         {
  83.                 switch(i)
  84.                 {
  85.                         case(0):W1=0;W2=0;W3=1;display(ge);break;
  86.                         case(1):/*if(v>10)*/W2=1;W1=0;W3=0;display(shi);break;
  87.                         case(2):/*if(v>100)*/W1=1;W2=0;W3=0;display(bai);break;
  88.                 }
  89.                 j=50;
  90.                 while(j--);            
复制代码



回复

使用道具 举报

ID:272119 发表于 2019-9-20 19:27 | 显示全部楼层
看程序你是单次测试,一般做AD都是多次测试掐头去尾取中间的均值哦,之前我用20次循环值取均值都有10个数字的跳动哦.
回复

使用道具 举报

ID:243602 发表于 2019-9-21 00:20 | 显示全部楼层
你这个半波的交流电压,需要准的话,假设定时1ms中断,连续采20个数值,去掉一个最高值,取次高值*0.707可得交流有效值电压
回复

使用道具 举报

ID:123289 发表于 2019-9-21 09:25 | 显示全部楼层
用这个电路,你就不怕被电到!
AD切换后,要待其充电充分后再起动测试!
回复

使用道具 举报

ID:425027 发表于 2020-8-7 15:01 | 显示全部楼层
逻辑写的不好
回复

使用道具 举报

ID:767423 发表于 2020-8-8 09:45 | 显示全部楼层
用测直流电的算法去测交流电,再怎么平均滤波显示都一直变化的。因为交流电本身就是一直变化的,一直不变的那是直流电。测交流电要在一个频率周期采样N点,然后采用最大值法或均方根法计算。N的个数越大越精确。最大值法最简单,精度不高。均方根法最准,但耗时。
回复

使用道具 举报

ID:748788 发表于 2020-8-8 23:03 | 显示全部楼层
能不能分享那两个头文件呀?让大家一窥神秘的九齐
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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