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

用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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版