你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

用AD检测交流电压信号,用FFT算法?

[复制链接]
qazplm3218 提问时间:2019-10-31 11:32 /
用AD检测交流电压(50HZ)信号,电路已经加直流偏执太高电压,没有负电压。用FFT算法
用定时器中断,100us中断一次,每中断一次读取一次AD值,共中断200次,就是20ms一个周期,读取200次放入数组,然后关闭定时器,然后通过均方根得到最后AD数值,然后在打开定时器。
现在的问题是得到的数值的个位一直在变化(数值为3位数),并且精度也不是很高,是方法有问题还是程序有问题??

uint16_t Get_Adc(void)   
{       
   ADC_SoftwareStartConvCmd(ADC1,ENABLE);                                //启动ADC转换
   while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));        //等待转换完成
   return ADC_GetConversionValue(ADC1);       
}


void TIM3_IRQHandler(void)
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)                                 //100us中断一次
        {
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update );        
                Num[ccc]=Get_Adc();
                ccc++;
                if(ccc>200)
                {
                        ccc=0;
                        TIM_Cmd(TIM3, DISABLE);  
                        flag=1;
                }                       
        }
}


void yyy(void)
{
        uint16_t j=0;       
        uint16_t i=0;       
        if(flag==1)
        {
                flag=0;
                for(j=0;j<200;j++)
                {
                        zzz[j] = (float)Num[j]*3300/4096-1640;
                        ad+=zzz[j]*zzz[j];                               
                }
                ad = sqrt(ad/200);
               TIM_Cmd(TIM3, ENABLE);
        }       



收藏 评论14 发布时间:2019-10-31 11:32

举报

14个回答
qazplm3218 回答时间:2019-11-23 21:28:04
edmundlee 发表于 2019-11-23 10:40
你的图只是一个参考电压的电路, 没看到你是怎样把交流加上参考电压的啊 ...

完整电路图

QQ截图20191123212621.jpg
QQ图片20191122154118.png
radio2radio 回答时间:2019-10-31 11:39:17
问题是你的目的是什么,单一频率的信号。
wenyangzeng 回答时间:2019-10-31 12:47:32
无标题.png

根据公式,zzz[]数组赋值不对,应该是直接的AD转换值u(1)、u(2)........。开方运算后才是电压值。而且变量ad累加200次还需要考虑溢出的问题。


qazplm3218 回答时间:2019-10-31 13:56:58
wenyangzeng 发表于 2019-10-31 12:47
根据公式,zzz[]数组赋值不对,应该是直接的AD转换值u(1)、u(2)........。开方运算后才是电压值。而且变 ...

zzz[]数组里的值是平方和,
ad = sqrt(ad/200);是开根号
wenyangzeng 回答时间:2019-10-31 14:37:02
qazplm3218 发表于 2019-10-31 13:56
zzz[]数组里的值是平方和,
ad = sqrt(ad/200);是开根号

每个u(n)得到一个绝对值了,那个*3300/4096-1640的运算不应该做的
qazplm3218 回答时间:2019-10-31 14:44:00
wenyangzeng 发表于 2019-10-31 14:37
每个u(n)得到一个绝对值了,那个*3300/4096-1640的运算不应该做的

3300/4096-1640
是直接取消掉不要了,1640,是直流偏执电压,所有要减去
butterflyspring 回答时间:2019-11-18 17:19:47
要不就用慢办法,分步来,先看ADC的值对不对,再计算一两组和理论公式对应一下
edmundlee 回答时间:2019-11-21 12:26:07
你的直流偏压是怎样加上去的?如果是直接的AC+DC, 那你的公式就错了, 那能把DC也算进去的
qazplm3218 回答时间:2019-11-22 15:38:48
edmundlee 发表于 2019-11-21 12:26
你的直流偏压是怎样加上去的?如果是直接的AC+DC, 那你的公式就错了, 那能把DC也算进去的 ...

电压偏置电路

QQ图片20191122154118.png
qazplm3218 回答时间:2019-11-22 15:39:59

偏置电压为3.3/2
edmundlee 回答时间:2019-11-23 10:40:16

你的图只是一个参考电压的电路, 没看到你是怎样把交流加上参考电压的啊
edmundlee 回答时间:2019-11-24 17:09:31

就是1640这个数有稍微的误差,应该是1590,  但这都不应该对你的精度有大的影响
wujianwxj 回答时间:2019-12-20 08:36:58
8楼说得没错,你把直流分量算进去了。每次检测两个值,一个是交流+直流的;一个是直流的。然后减掉直流的绝对值丢进数组吧。
qazplm3218 回答时间:2019-12-21 13:18:03
wujianwxj 发表于 2019-12-20 08:36
8楼说得没错,你把直流分量算进去了。每次检测两个值,一个是交流+直流的;一个是直流的。然后减掉直流的绝 ...

那具体要怎么做,要用什么公式?
请您指点一下。。!

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版