当前位置:首页 » 操作系统 » 单片机滤波算法

单片机滤波算法

发布时间: 2023-05-23 15:27:22

‘壹’ 设计一个定时器产生秒脉冲,误差在300纳秒以内,分布近似正态分布,期望近似于0。

虽然不是做这一行的,给一个我的思路吧。
首先你要有个本地的恒温晶振(如果要求确实高的话)蚂让,确保你本地的时钟不会因为温度飘偏。
接下来你需要一个自适应分配的算法,通过卫星授时来校正或者说初始化你的本地分频器的分频控制寄存器的一个参考值。卫星和本地时钟完全异步,我们假设卫星时钟源烂和本地时钟都绝对稳定,如此会间隔得到2个相邻的分频计数值。并且,在一段时间内的统计下会得到这2个分频计数的数量,我将这个看做一个比例。

算法开始:
开辟一段ram,假设1024的深度。卫星授时存在阶段认为是自适应初始化的过程,每次计数器计数结果按顺序存入ram,地址记满1024认为初始化完成,可以提供脱机时钟。
接下来进入修正学习阶段,跟踪并实时修正授时数据。地址跳回到0,继续按顺序刷新ram中各地址的计数结果。
卫星授雹物漏时消失后,进入脱机运行阶段。计数器按当前ram指针的数据提供脉冲,每完成一个脉冲ram指针加1。

此方式可以认为将计时所需的参考时钟频率提升了1024倍并且可以轻松达到更高精度,而如果硬要在实际的电路或者晶振本体上实现则很容易出现天花板效应,并且代价巨大。不仅如此,也解决了生产上的数据写入与实际晶振频率匹配的问题。

升级版:进入脱机模式后,将ram数据原封不动写入flash,下次启动系统的时候先将flash数据搬到ram中,即可直接进入脱机模式。

‘贰’ 新手,请教单片机ADC采样电池电压

1、霍尔传感器运郑首先经过霍尔传感器将电压电流信号,转化成小的电流信号。

‘叁’ 嵌入式cpu,mcu,soc,dsp之间的区别和联系

DSP、MCU、FPGA、ARM、CPU简介
?
DSP:用于实现数字信号处理的微处理器芯片。
?
MCU:微控制器,又称单片机。
?
FPGA:现场可编程门阵列。
?
ARM:采用ARM架构的微处理器。
CPU:中央处理单元(CentralProcessingUnit)的缩写
CPU主要由运算器、控制器、寄存器组和内部总线等构成
总之一句话CPU无处不在。
嵌入式系统定义:根据国际电气和电子工程师协会(IEEE)的定
义,嵌入式系统是“控制、监视或者辅助设备、机器和车间运行的
装置”。
p
应用领域:单片机偏于一般的控制和事务型处理,而DSP适合数
字信号处理的各种运算宴轿,FPGA由于其极强的灵活性和适应性,一晌则肆
般用于产品的原型开发,在航天领域有广泛应用。
ARM一般嵌入
一些微操作系统,如WindowsCE、Linux等,实时性强,提供简
单友好的形界面,便于扩展,有很好的移植性,主要盯颤用于复杂
控制。

‘肆’ 滤波电路和模数转换电路

ADC电路最好与单片机直接相连,中间隔一个滤波不合适。
理由:
1、ADC本来输出就是数字量,你加一个滤波,只会让输出的数字信号质量更差(本来ADC输出数字量,变化很敏感,加了滤波之后,高低电平变化差仿受限,边沿质量更差,容易造成数据误读),反而影响了单片机的读入。
2、如果你要对信号进行滤波,最好在ADC之前皮唯加滤波电路。
3、单片机直接从ADC得到数据后,还可以利用软件虚握纤滤波方法,比如取最近5个值的平均值,取若干个值的中位数等等,算法多多,就看你的发挥了。

‘伍’ 这是pic单片机加权平均值滤波 这几个数是怎么运算的 我想知道运算步骤和结果

看主程序:
void main(void)
{
while(1)
{
temp=filter(); //加权平均值滤波
printf("%d\n",temp);
TX_temp(); //未知,可能是串口发送
}
}

主要是这部分
char filter()
{
char i;
char value_buf[N];
int sum=0;
for(i=0;i<N;i++) //这个for循环把table中的值赋给value_buf数组
{
value_buf[i]=table[i]; //其实就是 value_buf[4]={10,20,30,65};
delay(500); /不知为何要加延时,本人感觉/毫无意义浪费cpu
}
for(i=0;i<N;i++) //关键部分 sum=10*1+20*2+30*3+40*4
sum+=value_buf[i]*mul[i];
return (char)(sum/sum_mul); //返回(10*1+20*2+30*3+40*4)/sum_mul,整数部分
}
这部分代码没什么用,就做了一让磨个简单的运算,加亏滑枝权平均值销敏滤波算法如下:
/*
* 输入 参数:1.需处理数组首地址
* 2.权数组首地址(暂且用power_buf,英文不行)
* 3.数组长度
*/
int filter(char *dat_buf_p, char *power_buf_p, char buf_num)
{
int sum=0;

int sum_mul=0;
for(char i=0; i<buf_num; i++)

{
sum+=(*dat_buf_p)*(*power_buf_p); //数组*权值

sum_mul+=*power_buf_p; //生成权值和
dat_buf_p++; //数组指针加一,指向数组中下一个数
power_buf_p++; //权数组指针加一,指向权数组中下一个权
}
return (int)(sum/ sum_mul);
}
你试试这个函数,有问题跟我说。

热点内容
g代码编译器 发布:2025-04-22 20:25:20 浏览:272
段式编译器 发布:2025-04-22 20:15:45 浏览:202
android原版 发布:2025-04-22 20:15:04 浏览:74
特种兵一个组怎么配置 发布:2025-04-22 20:01:15 浏览:733
oracle数据库命令 发布:2025-04-22 19:47:55 浏览:564
python异或运算符 发布:2025-04-22 19:45:21 浏览:832
网络为什么改不了服务器 发布:2025-04-22 19:44:38 浏览:535
js压缩base64 发布:2025-04-22 19:29:53 浏览:200
飓风加密工具 发布:2025-04-22 19:27:50 浏览:640
发票江苏服务器地址 发布:2025-04-22 19:21:29 浏览:34