A. 单片机采集信号,直接输出线性度不好(如图)。如何加个公式使其线性度变好(如白色线)
公式是够呛,你这得公式加补偿的方式做了,用ad采集信号的话,先找一个比例的系羡谈核数,在用ad采集的数称这个系数在 加或减侍游去兄掘补偿值,补偿得实际去摸索了,多做下试验吧
B. 请教用C++在430单片机里编程实现以下功能
直接用单片机做直线拟合。
假定输入N 对 y[i] 和 x[i],i=0,1,2...N-1。
配 直线方程 y=kx+b
#include <stdio.h>
#include <stdlib.h>
void main()
{
double x[]={1,2,3,4,5,6,7,8,9,10};
double y[]={0.9,2.1,3.0,4.0,5.1,5.9,7.0,8.1,8.9,10.0};
int N=10;
double A=0.0,B=0.0,C=0.0,D=0.0;
int i,j;
double k,b;
// 这里插入
// 给出个数据个数,动态分配x,y单元
// 读入 x,y数据输入
// 当然控制A/D转换,取得数据也可以
// 直线拟合如下
for (i=0;i<N;i++) A = A+ y[i];
for (i=0;i<N;i++) B = B+ x[i];
for (i=0;i<N;i++) C=C + x[i]*y[i];
for (i=0;i<N;i++) D=D + x[i]*x[i];
// y=kx + b;
k = (A * B - C * N)/(B * B - D * N);
b = (B*C - A * D) / (B * B - D * N);
printf("y=%lf * x + %lf\n",k,b);
}
C. 急求基于51单片机的LCD显示实时数据曲线!!
先实现划线的函数,把相邻的采样点转化为屏幕坐标之后,连接起来就可以了,下面划线函数可以作为参考
void Line(char x1,char y1,char x2,char y2)
{
char xdelta; // width of rectangle around line
char ydelta; // height of rectangle around line
char xinc; //increment for moving x coordinate
char yinc; //increment for moving y coordinate
char rem; //current remainder
//Bool bit = 0;//used for dashed lines
char s,e; //Start,End
//See if the line is horizontal or vertical. If so, then call special routines.
if (y1 == y2)
{ //draw a horizontal line
if(x1 > x2 ) s = x2,e = x1;
else s = x1,e = x2;
for(; s <= e; s++) SetPixel(s,y1,1);
}
else if (x1 == x2)
{//draw a vertical line
if(y1 > y2 ) s = y2,e = y1;
else s = y1,e = y2;
for(; s <= e; s++) SetPixel(x1,s,1);
}
else
{// The line may be partially obscured. Do the draw line algorithm
// checking each point against the clipping regions.
xdelta = x2 - x1;
ydelta = y2 - y1;
if (xdelta < 0) xdelta = -xdelta;
if (ydelta < 0) ydelta = -ydelta;
xinc = (x2 > x1)? 1 : -1;
yinc = (y2 > y1)? 1 : -1;
// draw the first point
//SetPixel( x1, y1, 1);
if (xdelta >= ydelta)
{
rem = xdelta / 2;
for (;x1 != x2; x1 += xinc)
{
SetPixel(x1, y1,1);
rem += ydelta;
if (rem >= xdelta){
rem -= xdelta;
y1 += yinc;
}
}
}
else
{
rem = ydelta / 2;
for (;y1 != y2; y1 += yinc)
{
SetPixel(x1, y1,1);
rem += xdelta;
if (rem >= ydelta) {
rem -= ydelta;
x1 += xinc;
}
}
}
}
g_nCoordinateX = x2;//
g_nCoordinateY = y2;
}
D. 单片机最多可以拟合多少个点(拟合成直线方程的)
1.单片机拟合的重点不在于多少个点(一个都没有当然不行,这里是排除极端现象),而在于拟合算法;
2.目前市面上的单片机有8位,16位,32位等等,价格和运算能力都很不错,有些还有自己的支持库,因此,纯粹从单片机考虑不是太大的问题;
3.一般的做法是:先采集这些数据(尽可能多),利用仿真软件如matlab进行算法仿真,根据这个仿真可以直接的了解到需要拟合该直线的最少数据,根据此数据选择或者优化算法,然后根据此算法选择适当价格和运算能力的单片机;根据单片机单位时间(即你需要处理的最小周期)采集数据,由此可以确定下来最终的实现算法
4.一般的方法有:插值法,最小二乘法(用法最为广泛,实现也容易,多用于计算机),方差逼近法等等
E. 如何将单片机传输的数据绘成曲线图
是单片机连接上位机绘图吗?如是,需要上位机程序里面根据单片机传输的数据执行绘图操作。单片机电路板等开发设计我这可以的。
F. 鍗旷墖链哄备綍鎶婇潪绾挎у彉涓虹嚎镐
镆ユ垒琛ㄣ佹暟瀛﹀嚱鏁伴艰繎銆
1銆佹煡镓捐〃锛氭煡镓捐〃鏄涓绉嶅皢闱炵嚎镐ц緭鍏ユ椠灏勫埌绾挎ц緭鍑虹殑鏂规硶銆备娇鐢ㄥ崟鐗囨満鍒涘缓涓涓镆ユ垒琛锛屽皢闱炵嚎镐ц緭鍏ュ间笌鐩稿簲镄勭嚎镐ц緭鍑哄艰繘琛岄厤瀵癸纴阃氲繃鍦ㄧ▼搴忎腑镆ユ垒杈揿叆鍊煎苟杩斿洖鐩稿簲镄勮緭鍑哄硷纴鍙浠ュ疄鐜伴潪绾挎у埌绾挎х殑杞鎹銆
2銆佹暟瀛﹀嚱鏁伴艰繎锛氩傚氶”寮忔嫙钖堟垨镟茬嚎𨰾熷悎銆傞氲繃閲囬泦涓绯诲垪闱炵嚎镐ц緭鍏ュ拰鐩稿簲镄勭嚎镐ц緭鍑烘牱链鏁版嵁锛屼娇鐢ㄥ悎阃傜殑鏁板﹀嚱鏁拌繘琛岄艰繎锛屼互瀹炵幇闱炵嚎镐у埌绾挎х殑杞鎹銆
G. 大神们如何用Matlab 神经网络 拟合出一个两输入一输出的曲线 公式我写进单片机里 不剩感激.
不用神经网络这么麻烦,matlab里面有一个专门用来做拟和的语句吧。没记错的话是polyfit