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