tag 标签: matlab

相关帖子
相关博文
  • 热度 5
    2020-9-8 09:10
    606 次阅读|
    0 个评论
    matlab 生成 测温电阻  Rt表
    由 B 值可以推导出不同温度 t 下的电阻值 R = R0 * exp(B*(1/t - 1/T0)); 其中 R 为温度 t 下的电阻值 R0 为 25 度时的电阻值 T0 为 25 度 注:上述温度值都应是开氏温度,也就是说,需要加上绝对零度值 273.15 下面是从 0~100 度,间隔 0.1 度生成的 Rt 表, B 值,上拉电阻值可以修改成所需要的。 K = 273.15; B = 3950; T0 = K + 25; R0 = 10000; % 25 度时的阻值 Ru = 5000; % 上拉电阻 i = 0:1023; outstr = sprintf(' /* B const %d */ \n const Rt = {'; %outstr = ; t = i / 10 + K; R = R0 * exp(B*(1./t - 1/T0)); Vo = 3.3 * R./(Ru+R) Rt = round( Vo / 3.3 * 4096); for j = 1:length(Rt) if mod(j,16) == 0 outstr = ; else outstr = ; end end outstr = plot(i/10,Rt) outstr = sprintf('B %d Rpu %d ',B,Ru); Title(outstr) /* B const 3950 Rpu 5000 */ const Rt[] = { 3566, 3563, 3561, 3558, 3556, 3553, 3551, 3548, 3546, 3543, 3541, 3538, 3536, 3533, 3531, 3528, 3526, 3523, 3520, 3518, 3515, 3513, 3510, 3507, 3505, 3502, 3500, 3497, 3494, 3492, 3489, 3486, 3484, 3481, 3478, 3475, 3473, 3470, 3467, 3464, 3462, 3459, 3456, 3453, 3451, 3448, 3445, 3442, 3439, 3437, 3434, 3431, 3428, 3425, 3422, 3419, 3417, 3414, 3411, 3408, 3405, 3402, 3399, 3396, 3393, 3390, 3387, 3384, 3381, 3378, 3376, 3373, 3370, 3367, 3363, 3360, 3357, 3354, 3351, 3348, 3345, 3342, 3339, 3336, 3333, 3330, 3327, 3324, 3320, 3317, 3314, 3311, 3308, 3305, 3302, 3298, 3295, 3292, 3289, 3286, 3282, 3279, 3276, 3273, 3270, 3266, 3263, 3260, 3257, 3253, 3250, 3247, 3243, 3240, 3237, 3233, 3230, 3227, 3224, 3220, 3217, 3213, 3210, 3207, 3203, 3200, 3197, 3193, 3190, 3186, 3183, 3179, 3176, 3173, 3169, 3166, 3162, 3159, 3155, 3152, 3148, 3145, 3141, 3138, 3134, 3131, 3127, 3124, 3120, 3117, 3113, 3110, 3106, 3102, 3099, 3095, 3092, 3088, 3085, 3081, 3077, 3074, 3070, 3066, 3063, 3059, 3055, 3052, 3048, 3045, 3041, 3037, 3033, 3030, 3026, 3022, 3019, 3015, 3011, 3008, 3004, 3000, 2996, 2993, 2989, 2985, 2981, 2978, 2974, 2970, 2966, 2962, 2959, 2955, 2951, 2947, 2943, 2940, 2936, 2932, 2928, 2924, 2920, 2917, 2913, 2909, 2905, 2901, 2897, 2893, 2889, 2886, 2882, 2878, 2874, 2870, 2866, 2862, 2858, 2854, 2850, 2846, 2843, 2839, 2835, 2831, 2827, 2823, 2819, 2815, 2811, 2807, 2803, 2799, 2795, 2791, 2787, 2783, 2779, 2775, 2771, 2767, 2763, 2759, 2755, 2751, 2747, 2743, 2739, 2735, 2731, 2727, 2723, 2719, 2714, 2710, 2706, 2702, 2698, 2694, 2690, 2686, 2682, 2678, 2674, 2670, 2666, 2661, 2657, 2653, 2649, 2645, 2641, 2637, 2633, 2629, 2625, 2620, 2616, 2612, 2608, 2604, 2600, 2596, 2591, 2587, 2583, 2579, 2575, 2571, 2567, 2563, 2558, 2554, 2550, 2546, 2542, 2538, 2533, 2529, 2525, 2521, 2517, 2513, 2508, 2504, 2500, 2496, 2492, 2488, 2483, 2479, 2475, 2471, 2467, 2463, 2458, 2454, 2450, 2446, 2442, 2437, 2433, 2429, 2425, 2421, 2417, 2412, 2408, 2404, 2400, 2396, 2391, 2387, 2383, 2379, 2375, 2370, 2366, 2362, 2358, 2354, 2349, 2345, 2341, 2337, 2333, 2329, 2324, 2320, 2316, 2312, 2308, 2303, 2299, 2295, 2291, 2287, 2283, 2278, 2274, 2270, 2266, 2262, 2257, 2253, 2249, 2245, 2241, 2237, 2232, 2228, 2224, 2220, 2216, 2212, 2207, 2203, 2199, 2195, 2191, 2187, 2182, 2178, 2174, 2170, 2166, 2162, 2158, 2153, 2149, 2145, 2141, 2137, 2133, 2129, 2124, 2120, 2116, 2112, 2108, 2104, 2100, 2096, 2091, 2087, 2083, 2079, 2075, 2071, 2067, 2063, 2059, 2055, 2050, 2046, 2042, 2038, 2034, 2030, 2026, 2022, 2018, 2014, 2010, 2006, 2002, 1998, 1993, 1989, 1985, 1981, 1977, 1973, 1969, 1965, 1961, 1957, 1953, 1949, 1945, 1941, 1937, 1933, 1929, 1925, 1921, 1917, 1913, 1909, 1905, 1901, 1897, 1893, 1889, 1885, 1881, 1877, 1873, 1870, 1866, 1862, 1858, 1854, 1850, 1846, 1842, 1838, 1834, 1830, 1826, 1823, 1819, 1815, 1811, 1807, 1803, 1799, 1795, 1791, 1788, 1784, 1780, 1776, 1772, 1768, 1765, 1761, 1757, 1753, 1749, 1745, 1742, 1738, 1734, 1730, 1726, 1723, 1719, 1715, 1711, 1708, 1704, 1700, 1696, 1693, 1689, 1685, 1681, 1678, 1674, 1670, 1666, 1663, 1659, 1655, 1652, 1648, 1644, 1641, 1637, 1633, 1630, 1626, 1622, 1619, 1615, 1611, 1608, 1604, 1600, 1597, 1593, 1590, 1586, 1582, 1579, 1575, 1572, 1568, 1565, 1561, 1557, 1554, 1550, 1547, 1543, 1540, 1536, 1533, 1529, 1526, 1522, 1519, 1515, 1512, 1508, 1505, 1501, 1498, 1494, 1491, 1487, 1484, 1480, 1477, 1474, 1470, 1467, 1463, 1460, 1456, 1453, 1450, 1446, 1443, 1440, 1436, 1433, 1429, 1426, 1423, 1419, 1416, 1413, 1409, 1406, 1403, 1400, 1396, 1393, 1390, 1386, 1383, 1380, 1377, 1373, 1370, 1367, 1364, 1360, 1357, 1354, 1351, 1347, 1344, 1341, 1338, 1335, 1331, 1328, 1325, 1322, 1319, 1316, 1312, 1309, 1306, 1303, 1300, 1297, 1294, 1291, 1287, 1284, 1281, 1278, 1275, 1272, 1269, 1266, 1263, 1260, 1257, 1254, 1251, 1248, 1245, 1242, 1239, 1236, 1233, 1230, 1227, 1224, 1221, 1218, 1215, 1212, 1209, 1206, 1203, 1200, 1197, 1194, 1191, 1188, 1186, 1183, 1180, 1177, 1174, 1171, 1168, 1165, 1163, 1160, 1157, 1154, 1151, 1148, 1146, 1143, 1140, 1137, 1134, 1132, 1129, 1126, 1123, 1120, 1118, 1115, 1112, 1109, 1107, 1104, 1101, 1099, 1096, 1093, 1090, 1088, 1085, 1082, 1080, 1077, 1074, 1072, 1069, 1066, 1064, 1061, 1058, 1056, 1053, 1051, 1048, 1045, 1043, 1040, 1038, 1035, 1032, 1030, 1027, 1025, 1022, 1020, 1017, 1015, 1012, 1010, 1007, 1005, 1002, 999, 997, 995, 992, 990, 987, 985, 982, 980, 977, 975, 972, 970, 968, 965, 963, 960, 958, 955, 953, 951, 948, 946, 944, 941, 939, 936, 934, 932, 929, 927, 925, 922, 920, 918, 916, 913, 911, 909, 906, 904, 902, 900, 897, 895, 893, 891, 888, 886, 884, 882, 879, 877, 875, 873, 871, 868, 866, 864, 862, 860, 858, 855, 853, 851, 849, 847, 845, 842, 840, 838, 836, 834, 832, 830, 828, 826, 824, 821, 819, 817, 815, 813, 811, 809, 807, 805, 803, 801, 799, 797, 795, 793, 791, 789, 787, 785, 783, 781, 779, 777, 775, 773, 771, 769, 767, 765, 763, 761, 760, 758, 756, 754, 752, 750, 748, 746, 744, 742, 741, 739, 737, 735, 733, 731, 729, 728, 726, 724, 722, 720, 718, 717, 715, 713, 711, 709, 708, 706, 704, 702, 700, 699, 697, 695, 693, 692, 690, 688, 686, 685, 683, 681, 680, 678, 676, 674, 673, 671, 669, 668, 666, 664, 663, 661, 659, 658, 656, 654, 653, 651, 649, 648, 646, 644, 643, 641, 640, 638, 636, 635, 633, 632, 630, 628, 627, 625, 624, 622, 621, 619, 617, 616, 614, 613, 611, 610, 608, 607, 605, 604, 602, 601, 599, 598, 596, 595, 593, 592, 590, 589, 587, 586, 584, 583, 581, 580, 578, 577, 575, 574, 573, 571, 570, 568, 567, 565, 564, 563, 561, 560, 558, 557, 556, 554, 553, 551, 550, 549, 547, 546, 545, 543, 542, 540, 539, 538, 536, 535, 534, 532, 531, 530, 528, 527, 526, 524, 523, 522, 521, 519, 518, 517, 515, 514, 513, 512, 510, 509, 508, 506, 505, 504, 503, 501, 500, 499, 498, 496, 495, 494, 493, 492, 490, 489, 488, 487, 486, 484, 483, 482, 481, 480, 478, 477, 476, 475, 474, };
  • 热度 5
    2018-5-3 22:11
    1764 次阅读|
    1 个评论
    【博客大赛】使用MATLAB一键制作mif文件
    这里讲解实现一个16384(2^14)点的14位正弦波数据mif格式文件的生成,使用此文件,我们便可以在FPGA上基于直接数字合成(DDS)原理生成标准的正弦波,即实现信号发生器的功能。关于DDS原理的相关内容,请参考由北航出版社出版的《FPGA自学笔记——设计与验证》一书第六章第6.2节—— “双通道幅频相可调DDS信号发生器” 一节的内容。   在很早之前,我曾编写过一个生成1024点16位正弦波mif文件的方法,不过那时候我的matlab技术还特别特别菜(现在也很菜),只是在matlab中简单的实现了正弦波数据的生成,关于四舍五入取整以及mif文件的最终生成,我用了excel和quartus两个软件经过了复杂的操作才最终完成。如今,自己都对那种方法没有了耐心,刚好新做的一个双通道14位高速DAC模块在做DDS实验时需要用到14位的mif数据,因此今天对matlab的脚本文件重新编写了下,实现了仅通过Matlab就可以一键生成mif文件的功能。 Script。在该文件中输入以下内容: F1=1;%信号的频率 Fs=2^14;%采样频率 P1=0;%信号初始相位 N=2^14;%采样点数为N t= ;%采样时刻 ADC=2^13 - 1;%直流分量 A=2^13;%信号幅度 s=A*sin(2*pi*F1*t +pi*P1/180) + ADC;%生成信号 plot(s);%绘制图形 fild =fopen('d:/sin14bit_16384.mif','wt');%创建mif文件 %写入mif文件文件头 fprintf(fild,'%s\n','WIDTH=14;');%位宽 fprintf(fild,'%s\n\n','DEPTH=16384;');%深度 fprintf(fild,'%s\n','ADDRESS_RADIX=UNS;');%地址格式 fprintf(fild,'%s\n\n','DATA_RADIX=HEX;');%数据格式 fprintf(fild,'%s\t','CONTENT');%地址 fprintf(fild,'%s\n','BEGIN');% fori= 1:N s2(i) =round(s(i));%对小数四舍五入以取整 ifs2(i) <0%强制将负1置0, s2(i) = 0 end % addr : data; fprintf(fild,'\t%g\t',i-1);%地址,从0开始编码 fprintf(fild,'%s\t',':'); fprintf(fild,'%x',s2(i)); fprintf(fild,'%s\n',';'); end 用户如果想自己生成其他深度和位宽的数据,只需要对应修改采样频率(Fs)、采样点数(N)、直流分量(ADC)和信号幅度(A)即可。   保存文件,点击运行按钮,即可生成我们所需要的正弦波数据,并在电脑的D盘根目录生成一个名为“sin14bit_16384 .mif”的文件。 随后,会弹出如下图1所示的界面,该界面便是以我们生产的数据为值,t为时间轴绘制出来的波形,从波形可知为标准的正弦波,你也可以通过放大缩小来具体查看几个顶点的值,以确定数据是否在自己预期的范围内。这里,我们直接关掉该界面即可。 下图2为使用该文件设计的DDS信号发生器系统,输出频率为3.448Mhz(随机设置的一个值),通过示波器的FFT功能可以看到,谐波量并不大。
  • 热度 5
    2013-6-20 18:43
    1302 次阅读|
    3 个评论
      在进行算法验证的时候,Matlab无疑是一把利器,如果将用C写的代码, 在用Matlab实现一遍,确实很浪费时间。当对于Matlab不是特别熟悉的时候, 尤其麻烦。 关于Matlab调用C的方式,已经固定了,介绍也很多。 但是有一个地方,还没有见到有很多介绍。 如何在C中方便地使用Matlab传递过来的变量?   由于Matlab中常使用double型变量,而C中最常使用的是int型变量,当使用mexFunction函数将变量以mxArray格式传递到C文件中的时候, 如果在C文件中使用的不是double型,都要 要进行数据转换。double型的计算精度要高于int型及其他类型,如果使用double型进行计算,可能结果会优于实际情况。如果强行使用指针进行转换,因为double型和int型占用的内存空间不一样,势必会出现问题。   想了一些方法后,发现最简单的是,开辟一个元素个数相同的数组或者矩阵。将prhs中的元素都进行强制类型转换,复制到新的数组或者矩阵中,然后对于这个新的数组或者矩阵进行操作。   在返回时,将开辟的数组或者矩阵中的元素再进行强制转换,复制到plhs中。回到Matlab的double类型。   当然这样做一个不好的地方就是,占用了不少内存。   注: void mexFunction(int nlhs, mxArray *plhs ) {      uint32_t i;      uint32_t count;      uint32_t m;      uint32_t n;      double   *in;      double   *out;      uint32_t *handle;      if(prhs == NULL)           return;      in = (double*)mxGetPr(prhs );      m = mxGetM(prhs );      n = mxGetN(prhs );      plhs = (double*)mxCreateDoubleMatrix(m, n, mxREAL);      out = (double*)mxGetPr(plhs );      handle = (uint32_t *)malloc(m*n*sizeof(uint32_t ));      count = m* n;      mexPrintf("the count:%d\n", count);      for(i = 0; i count; i++)      {           handle = (uint32_t)in ; //          mexPrintf("the data: %u, d: %lf\n", handle , in );      }      for(i = 0; i count; i++)      {           DataProcess(handle );          }      for(i = 0; i count; i++)      {           out = (double)handle ;           mexPrintf("the i: %d the data: %u, d: %lf\n", i, handle , out );      }          nlhs = count;      mexPrintf("the nlhs: %d\n", nlhs); }
  • 热度 4
    2012-8-29 21:02
    270 次阅读|
    0 个评论
        这算是我最后一个用单片机做的项目,到现在已经隔了2年多了。发现对软件上很多细节的地方都生疏了,而硬件则还好。可能是太久没摸单片机的缘故,也可能是用习惯了FPGA,针对任何应用首先考虑的方案都是使用FPGA的解决方案。当然,对于商业应用FPGA还远没有达到取代单片机,甚至完全取代DSP的程度。我想,随着FPGA的普及,尤其在我们这代,学DSP的人越来越少,MCU又五花八门,ARM/CorteX有计算机的抢饭碗,学电子的大多都会选择FPGA。就我所在的小圈里,真正能接触到科技前沿的毫无例外全是FPGA,其他的大多数只能停留在商业层面。话虽如此,不过现今赚钱才是硬道理,行行都能出状元。前段时间看科技频道我爱发明,就有一个人发明了一个光控锁发家了。这也充分说明了单片机也有大智慧,不必一味的追求高科技。     下面和大家一起分享一下这个湿度计,顺便我也小总结一下。     实物图如下:     上位机软件GUI界面:       系统功能概述:该湿度计由湿度采集和显示两部分组成,显示部分通过串口排线与采集部分相连,并采用7段式LED显示湿度值,定标所需的最小二乘法直线拟合参数由上位机软件计算完成并将参数发回湿度计进行定标处理。软件的定标也分手动和自动两部分,定标功能和湿度控制器类似。参见http://bbs.ednchina.com/BLOG_ARTICLE_3006306.HTM         由于湿度显示部分较简单,接下来主要介绍湿度采集部分和上位机软件部分。       湿度采集板概述:该板的主要特点就是小,板子的尺寸只有54*11(mm)。在这个尺寸上放置了单片机MSP430F2132、CD4046、MAX3232、MC34063以及相关的外围电路等。至于电路原理和湿度控制器一样。印象最深的就是手工焊接的时候老是丢东西,而且这款430小单片机不是被静电打坏,就是被焊坏。开关电源的开关芯片也是如此。所以,以后要是再有类似的活我肯定是不合格的,得请专业人士来弄。      上位机软件概述:该软件是在串口调试助手代码的基础上修改的,当时并不是不熟悉VC或者其他语言,主要考虑到自己是学电子,以后主要从事信号处理的研究。参考上面贴出来的GUI界面,简单介绍一下各部分功能。 左板块:串口调试功能。扩展了10进制显示,uint32与float32发送。 右板块:湿度定标功能 1:设定任意5个由低到高的标准湿度环境 2:手动读取湿度值,记录读取次数,5次循环显示,清除数据。 3:定时自动读取湿度值,可设置环境切换时间与取样等待时间。 4:5次取数后进行数据拟合,打开图形窗打印拟合曲线与样点。同时得到拟合曲线方程系数,等待发送。 PS:通过调试已经加入了系统运行调试操作出错处理消息框。     从打印出的菜单中可以看到有0~4这五种操作模式,单片机的程序和网上很多开发板的test程序类似。 图文说明如下:    首先,发送十六进制命令“0”,打印菜单(此时字符显示)。     其次,发送十六进制命令“1”,显示当最新拟合公式计算的湿度定标数据(将字符显示转化为十进制显示)。如下图,从字符显示转为十进制的数据打印图。当前湿度为68%。     然后,发送十六进制命令“2”,等待发送直线拟合方程的浮点系数,窗口提示如下图。如不记得命令可以从新发“0”打印。     最后,将方程的斜率和截距以空格隔开同时输入,并切换为float32格式,点击发送即可。         这时,窗口会显示当前存储的数据个数,选择“0”表示没有定标拟合计算的湿度值,选择“1”表示使用刚才保存的拟合数据进行定标计算的湿度值。以此类推,每输入一次将往下加并显示次数,可以保存多组数据,这也与湿度控制器一样,只不过没有16次那么多。本来应该将输入一个简单的直线方程的计算结果截图说明一下,但时间太久,有些图片已经不在或者当时没有保留。不过这并不影响对定标功能的理解。该项目做到这一步并不是直接的产品,而只是一个样板。定标是为了工厂在批量生产时出厂前的数据校正,不可能用matlab的上位机软件。顺便指出一下,湿度的准确测量有两个难点,一个是标准湿度环境不容易实现,密封性要求非常高,而且要在密封的湿度环境中取样也不容易。另一个就是湿度传感器的特性不一,当前用的湿度传感器在极限温度下将出现异常,这不仅与datasheet不服,而且对不同板子锁相环的中心频率点不好取舍。要达到一定的精度,采集电路还需要改进。         接下来参考我以前写过的文档,将当时联调所遇到的问题以及怎么解决的总结一下(解决是解决了,但分析的原因可能不正确)。   所遇到的问题              解决办法 1.如何通过430单片机发送数据到PC中使Matlab GUI中的Edit控件换行,用于美化打印的命令菜单。 原因:Edit控件接收两种换行命令ASCII码10(LF),16(CR),使用10容易出现跑死,猜测是因为串口接收过程中,定时回调函数与输入缓冲区满回调函数对Edit控件的赋值过程冲突,造成程序跑死。而使用16正常。 2.如何通过PC向430单片机发送4个byte以内的各种数据类型。在发送4byte数据时,单片机中uint32能实时转化保存,而float32不行 原因:之前的接收方法多此一举。因为经过调试发现串口发送的本就是相应数据的数据格式,不必接收后转化为相应类型再保存,可直接受完将缓冲数组保存至FLASH,读取时使用指向需要类型的指针即可。 3.MSP430F2132单片机在IAR环境中,调试容易出现堆栈溢出现象,FLASH各种数据类型存储不方便。系统涉及到长字符串的处理,C语言处理麻烦。设想使用C\C++混编。 堆栈溢出的原因:在2132接收中断处理函数中分支语句不能嵌套2层以上,特别对于分支较多的程序,不能使用switch语句,容易堆栈溢出,同时不能过多的在函数中设定static变量。设定IAR堆栈不能超过250。另外,在线调试的断点数不能超过2个。深层次的原因不详。对于FLASH操作可使用C++中函数重载的方式,对于字符串问题可使用C++中string类,效率比较谁高谁低占不清楚。       经过这两个单片机项目的洗礼,可以说当时几乎把MSP430大小系列的单片机拥有的资源都用了一遍。相比早前用的STC,ARM7,她最大的优势就是低功耗编程模式。所有的代码都是在中断响应内完成的。这完全得益于430较其他单片机复杂的系统时钟结构。最近,我刚接触到了日本的Renesas(瑞萨)M16C/62P系列单片机。要知道,在十大芯片供应商中,以单片机为主的就是瑞萨。我个人认为瑞萨应该就是单片机之王。而在我们身边,又有多少人了解这种单片机。真正看过德国人和日本人做的东西的人就知道,他们一直用的东西到我们手里后,大多都被认为是我们已经被淘汰的东西,但结果却是他们的产品反到经久耐用。我想这就是大量引进外资,进口芯片让我们思想上形成的弊病,求新求快,反正有钱好办事。在这样的思维方式的牵引下,要想摆脱制造转型设计不知道有多难。 附件: 基于matlab的上位机定标软件 RH.rar
  • 热度 4
    2012-8-29 21:01
    217 次阅读|
    0 个评论
        这算是我最后一个用单片机做的项目,到现在已经隔了2年多了。发现对软件上很多细节的地方都生疏了,而硬件则还好。可能是太久没摸单片机的缘故,也可能是用习惯了FPGA,针对任何应用首先考虑的方案都是使用FPGA的解决方案。当然,对于商业应用FPGA还远没有达到取代单片机,甚至完全取代DSP的程度。我想,随着FPGA的普及,尤其在我们这代,学DSP的人越来越少,MCU又五花八门,ARM/CorteX有计算机的抢饭碗,学电子的大多都会选择FPGA。就我所在的小圈里,真正能接触到科技前沿的毫无例外全是FPGA,其他的大多数只能停留在商业层面。话虽如此,不过现今赚钱才是硬道理,行行都能出状元。前段时间看科技频道我爱发明,就有一个人发明了一个光控锁发家了。这也充分说明了单片机也有大智慧,不必一味的追求高科技。     下面和大家一起分享一下这个湿度计,顺便我也小总结一下。     实物图如下:     上位机软件GUI界面:       系统功能概述:该湿度计由湿度采集和显示两部分组成,显示部分通过串口排线与采集部分相连,并采用7段式LED显示湿度值,定标所需的最小二乘法直线拟合参数由上位机软件计算完成并将参数发回湿度计进行定标处理。软件的定标也分手动和自动两部分,定标功能和湿度控制器类似。参见http://bbs.ednchina.com/BLOG_ARTICLE_3006306.HTM         由于湿度显示部分较简单,接下来主要介绍湿度采集部分和上位机软件部分。       湿度采集板概述:该板的主要特点就是小,板子的尺寸只有54*11(mm)。在这个尺寸上放置了单片机MSP430F2132、CD4046、MAX3232、MC34063以及相关的外围电路等。至于电路原理和湿度控制器一样。印象最深的就是手工焊接的时候老是丢东西,而且这款430小单片机不是被静电打坏,就是被焊坏。开关电源的开关芯片也是如此。所以,以后要是再有类似的活我肯定是不合格的,得请专业人士来弄。      上位机软件概述:该软件是在串口调试助手代码的基础上修改的,当时并不是不熟悉VC或者其他语言,主要考虑到自己是学电子,以后主要从事信号处理的研究。参考上面贴出来的GUI界面,简单介绍一下各部分功能。 左板块:串口调试功能。扩展了10进制显示,uint32与float32发送。 右板块:湿度定标功能 1:设定任意5个由低到高的标准湿度环境 2:手动读取湿度值,记录读取次数,5次循环显示,清除数据。 3:定时自动读取湿度值,可设置环境切换时间与取样等待时间。 4:5次取数后进行数据拟合,打开图形窗打印拟合曲线与样点。同时得到拟合曲线方程系数,等待发送。 PS:通过调试已经加入了系统运行调试操作出错处理消息框。     从打印出的菜单中可以看到有0~4这五种操作模式,单片机的程序和网上很多开发板的test程序类似。 图文说明如下:    首先,发送十六进制命令“0”,打印菜单(此时字符显示)。     其次,发送十六进制命令“1”,显示当最新拟合公式计算的湿度定标数据(将字符显示转化为十进制显示)。如下图,从字符显示转为十进制的数据打印图。当前湿度为68%。     然后,发送十六进制命令“2”,等待发送直线拟合方程的浮点系数,窗口提示如下图。如不记得命令可以从新发“0”打印。     最后,将方程的斜率和截距以空格隔开同时输入,并切换为float32格式,点击发送即可。         这时,窗口会显示当前存储的数据个数,选择“0”表示没有定标拟合计算的湿度值,选择“1”表示使用刚才保存的拟合数据进行定标计算的湿度值。以此类推,每输入一次将往下加并显示次数,可以保存多组数据,这也与湿度控制器一样,只不过没有16次那么多。本来应该将输入一个简单的直线方程的计算结果截图说明一下,但时间太久,有些图片已经不在或者当时没有保留。不过这并不影响对定标功能的理解。该项目做到这一步并不是直接的产品,而只是一个样板。定标是为了工厂在批量生产时出厂前的数据校正,不可能用matlab的上位机软件。顺便指出一下,湿度的准确测量有两个难点,一个是标准湿度环境不容易实现,密封性要求非常高,而且要在密封的湿度环境中取样也不容易。另一个就是湿度传感器的特性不一,当前用的湿度传感器在极限温度下将出现异常,这不仅与datasheet不服,而且对不同板子锁相环的中心频率点不好取舍。要达到一定的精度,采集电路还需要改进。         接下来参考我以前写过的文档,将当时联调所遇到的问题以及怎么解决的总结一下(解决是解决了,但分析的原因可能不正确)。   所遇到的问题              解决办法 1.如何通过430单片机发送数据到PC中使Matlab GUI中的Edit控件换行,用于美化打印的命令菜单。 原因:Edit控件接收两种换行命令ASCII码10(LF),16(CR),使用10容易出现跑死,猜测是因为串口接收过程中,定时回调函数与输入缓冲区满回调函数对Edit控件的赋值过程冲突,造成程序跑死。而使用16正常。 2.如何通过PC向430单片机发送4个byte以内的各种数据类型。在发送4byte数据时,单片机中uint32能实时转化保存,而float32不行 原因:之前的接收方法多此一举。因为经过调试发现串口发送的本就是相应数据的数据格式,不必接收后转化为相应类型再保存,可直接受完将缓冲数组保存至FLASH,读取时使用指向需要类型的指针即可。 3.MSP430F2132单片机在IAR环境中,调试容易出现堆栈溢出现象,FLASH各种数据类型存储不方便。系统涉及到长字符串的处理,C语言处理麻烦。设想使用C\C++混编。 堆栈溢出的原因:在2132接收中断处理函数中分支语句不能嵌套2层以上,特别对于分支较多的程序,不能使用switch语句,容易堆栈溢出,同时不能过多的在函数中设定static变量。设定IAR堆栈不能超过250。另外,在线调试的断点数不能超过2个。深层次的原因不详。对于FLASH操作可使用C++中函数重载的方式,对于字符串问题可使用C++中string类,效率比较谁高谁低占不清楚。       经过这两个单片机项目的洗礼,可以说当时几乎把MSP430大小系列的单片机拥有的资源都用了一遍。相比早前用的STC,ARM7,她最大的优势就是低功耗编程模式。所有的代码都是在中断响应内完成的。这完全得益于430较其他单片机复杂的系统时钟结构。最近,我刚接触到了日本的Renesas(瑞萨)M16C/62P系列单片机。要知道,在十大芯片供应商中,以单片机为主的就是瑞萨。我个人认为瑞萨应该就是单片机之王。而在我们身边,又有多少人了解这种单片机。真正看过德国人和日本人做的东西的人就知道,他们一直用的东西到我们手里后,大多都被认为是我们已经被淘汰的东西,但结果却是他们的产品反到经久耐用。我想这就是大量引进外资,进口芯片让我们思想上形成的弊病,求新求快,反正有钱好办事。在这样的思维方式的牵引下,要想摆脱制造转型设计不知道有多难。 附件: 基于matlab的上位机定标软件 RH.rar
相关资源
广告