如下一段代码,直接在主函数中运行,理应输出有正弦变化规律的一组数据。在MATLAB仿真时,mu=0.02,没有问题;在电脑上直接运行这段C,mu只能取到0.002,也没问题,可以输出正确结果;但是在67上时,调用串口输出要么是0要么是nan,还有一个问题是在这段代码里,最后的延时函数不可用,如果不屏蔽掉它的话,程序直接运行不下去。
怎么解决,求教。
#define M 40
#define len 200
int main(void)
{
float xs[]={ 1.500, 1.600, 1.699, 1.796, 1.889, 1.979, 2.065, 2.144, 2.217, 2.283, 2.341, 2.391, 2.432, 2.464, 2.485, 2.497, 2.500, 2.492, 2.474, 2.446, 2.409, 2.363, 2.308, 2.246, 2.175, 2.098, 2.016, 1.927, 1.835, 1.739, 1.641, 1.542, 1.442, 1.342, 1.244, 1.149, 1.057, 0.970, 0.888, 0.812, 0.743, 0.682, 0.628, 0.584, 0.548, 0.522, 0.506, 0.500, 0.504, 0.518, 0.541, 0.574, 0.617, 0.668, 0.727, 0.794, 0.869, 0.949, 1.035, 1.126, 1.221, 1.318, 1.417, 1.517, 1.617, 1.715, 1.812, 1.905, 1.994, 2.078, 2.157, 2.229, 2.294, 2.350, 2.399, 2.438, 2.468, 2.488, 2.499, 2.499, 2.489, 2.470, 2.441, 2.402, 2.355, 2.298, 2.234, 2.163, 2.085, 2.001, 1.912, 1.819, 1.723, 1.624, 1.525, 1.425, 1.326, 1.228, 1.134, 1.042, 0.956, 0.875, 0.800, 0.732, 0.672, 0.620, 0.577, 0.543, 0.519, 0.505, 0.500, 0.505, 0.521, 0.546, 0.581, 0.625, 0.677, 0.738, 0.806, 0.882, 0.963, 1.050, 1.142, 1.237, 1.334, 1.434, 1.534, 1.633, 1.732, 1.827, 1.920, 2.009, 2.092, 2.170, 2.240, 2.304, 2.359, 2.406, 2.444, 2.472, 2.491, 2.499, 2.498, 2.487, 2.466, 2.435, 2.395, 2.346, 2.288, 2.223, 2.150, 2.071, 1.986, 1.897, 1.803, 1.706, 1.608, 1.508, 1.408, 1.309, 1.212, 1.118, 1.028, 0.942, 0.862, 0.788, 0.722, 0.663, 0.612, 0.571, 0.539, 0.516, 0.503, 0.500, 0.507, 0.524, 0.551, 0.587, 0.633, 0.687, 0.749, 0.819, 0.895, 0.978, 1.065, 1.158, 1.253, 1.351, 1.450, 1.550, 1.650, 1.748, 1.843, 1.935, 2.023, 2.106, 2.182, 2.252, 2.314, 2.368};
float xn[]={ 0.999, 0.247, 0.661, 1.197, 0.402, 1.215, 1.244, 0.674, 1.653, 1.184, 1.035, 1.891, 1.086, 1.417, 1.893, 1.012, 1.728, 1.679, 1.000, 1.877, 1.319, 1.050, 1.808, 0.906, 1.120, 1.511, 0.532, 1.147, 1.031, 0.263, 1.068, 0.460, 0.122, 0.842, -0.089, 0.085, 0.475, -0.511, 0.100, 0.016, -0.736, 0.104, -0.444, -0.743, 0.048, -0.804, -0.566, -0.078, -0.975, -0.278, -0.247, -0.907, 0.034, -0.396, -0.606, 0.294, -0.451, -0.132, 0.462, -0.350, 0.417, 0.538, -0.067, 0.929, 0.561, 0.375, 1.311, 0.592, 0.904, 1.510, 0.684, 1.417, 1.522, 0.865, 1.806, 1.392, 1.121, 1.987, 1.192, 1.400, 1.925, 0.999, 1.620, 1.638, 0.867, 1.700, 1.197, 0.810, 1.584, 0.702, 0.805, 1.259, 0.255, 0.796, 0.768, -0.065, 0.722, 0.200, -0.225, 0.541, -0.336, -0.241, 0.244, -0.732, -0.165, -0.128, -0.914, -0.066, -0.501, -0.861, -0.003, -0.779, -0.604, -0.006, -0.880, -0.221, -0.064, -0.755, 0.192, -0.129, -0.408, 0.547, -0.136, 0.103, 0.786, -0.024, 0.680, 0.900, 0.237, 1.207, 0.918, 0.632, 1.587, 0.899, 1.099, 1.759, 0.905, 1.544, 1.718, 0.976, 1.865, 1.506, 1.115, 1.980, 1.203, 1.285, 1.854, 0.896, 1.417, 1.504, 0.654, 1.439, 1.002, 0.508, 1.295, 0.451, 0.449, 0.971, -0.038, 0.430, 0.501, -0.380, 0.390, -0.034, -0.532, 0.279, -0.526, -0.504, 0.078, -0.871, -0.350, -0.188, -0.995, -0.144, -0.459, -0.875, 0.040, -0.652, -0.543, 0.156, -0.689, -0.078, 0.198, -0.521, 0.415, 0.200, -0.152, 0.838, 0.219, 0.367, 1.122, 0.314, 0.938, 1.245, 0.524, 1.449, 1.233, 0.842, 1.798, 1.144};
int i,k;
float en[len];
float W[M][len];
float x[M];
float y=0.0;
float yn[len];
float mu=0.002;
int m=0;
u16 dacval=0;
u16 adcx,adcx1;
float temp;
u16 xx[50];
//u16 m;
int aa=0;
u16 times=0;
Cache_Enable(); //打开L1-Cache
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(432,25,2,9); //设置时钟,216Mhz ,时钟初始化
delay_init(216); //延时初始化
uart_init(115200); //串口初始化,参数为波特率
LED_Init(); //初始化LED
for(k=M;k<=len;k++)
{
for(i=0;i<M;i++)
{
x=xn[k-i-1];
}for(i=0;i<M;i++)
{
y+=W[k-2]*x;
}
en[k-1]=xs[k-1]-y;
for(i=0;i<M;i++)
{
W[k-1]=W[k-2]+2*mu*en[k-1]*x;
}
}
for(k=M;k<=len;k++)
{
for(i=0;i<M;i++)
{
x=xn[k-i-1];
}
for(i=0;i<M;i++)
{
yn[k]+=W[len-1]*x;
}
}
while(1)
{
for(k=M;k<=len;k++)
{
m=yn[k]*10000;
printf("%d,",m);
LED0_Toggle;
//delay_ms(500);
}
}
}
|