Пт июн 19, 2015 18:04:22
Пт июн 19, 2015 21:30:13
//#include "math.h"
#include <arm_math.h>
\ In section .text, align 4, keep-with-next
44 void mathFun (void) {
\ _Z7mathFunv: (+1)
\ 00000000 0xB510 PUSH {R4,LR}
45
46 alpha=0.1; //угол, сука, уже в радианах!!!! это очень удобно
\ 00000002 0x.... LDR.N R4,??DataTable3_4
47 c=10;
\ 00000004 0x.... LDR.N R0,??DataTable3_5 ;; 0x41200000
\ 00000006 0x6060 STR R0,[R4, #+4]
\ 00000008 0xED9F 0x.... VLDR.W S0,??DataTable3 ;; 0x3dcccccd
\ 0000000C 0xED84 0x0A02 VSTR S0,[R4, #+8]
48 a=c*arm_sin_f32(alpha); //Однако, пришла печаль. Без FPU на это действие надо 700 тактов!!! Берем проц с 4 ядром
\ 00000010 0x.... 0x.... BL arm_sin_f32
\ 00000014 0xEDD4 0x0A01 VLDR S1,[R4, #+4]
\ 00000018 0xEE20 0x0A80 VMUL.F32 S0,S1,S0
\ 0000001C 0xED84 0x0A00 VSTR S0,[R4, #0]
206 /* input x is in radians */
207 /* Scale the input to [0 1] range from [0 2*PI] , divide input by 2*pi */
208 in = x * 0.159154943092f;
\ arm_sin_f32: (+1)
\ 00000000 0xEDDF 0x.... VLDR.W S1,??DataTable1 ;; 0x3e22f983
\ 00000004 0xEE60 0x0A20 VMUL.F32 S1,S0,S1
209
210 /* Calculation of floor value of input */
211 n = (int32_t) in;
\ 00000008 0xEEBD 0x1AE0 VCVT.S32.F32 S2,S1
212
213 /* Make negative values towards -infinity */
214 if(x < 0.0f)
\ 0000000C 0xEEB5 0x0A40 VCMP.F32 S0,#0.0
\ 00000010 0xEE11 0x0A10 VMOV R0,S2
\ 00000014 0xEEF1 0xFA10 FMSTAT
\ 00000018 0xBF48 IT MI
215 {
216 n = n - 1;
\ 0000001A 0x1E40 SUBMI R0,R0,#+1
217 }
218
219 /* Map input value to [0 1] */
220 in = in - (float32_t) n;
\ 0000001C 0xEE00 0x0A10 VMOV S0,R0
\ 00000020 0xEEB8 0x0AC0 VCVT.F32.S32 S0,S0
\ 00000024 0xEE30 0x0AC0 VSUB.F32 S0,S1,S0
221
222 /* Calculation of index of the table */
223 index = (uint32_t) (tableSize * in);
\ 00000028 0xEDDF 0x.... VLDR.W S1,??DataTable1_1 ;; 0x43800000
\ 0000002C 0xEE20 0x0A20 VMUL.F32 S0,S0,S1
\ 00000030 0xEEFC 0x0AC0 VCVT.U32.F32 S1,S0
224
225 /* fractional value calculation */
226 fract = ((float32_t) tableSize * in) - (float32_t) index;
\ 00000034 0xEEB8 0x1A60 VCVT.F32.U32 S2,S1
\ 00000038 0xEE30 0x0A41 VSUB.F32 S0,S0,S2
227
228 /* Initialise table pointer */
229 tablePtr = (float32_t *) & sinTable[index];
230
231 /* Read four nearest values of output value from the sin table */
232 a = *tablePtr++;
233 b = *tablePtr++;
234 c = *tablePtr++;
235 d = *tablePtr++;
236
237 /* Cubic interpolation process */
238 wa = -(((0.166666667f) * (fract * (fract * fract))) +
239 ((0.3333333333333f) * fract)) + ((0.5f) * (fract * fract));
240 wb = (((0.5f) * (fract * (fract * fract))) -
241 ((fract * fract) + ((0.5f) * fract))) + 1.0f;
242 wc = (-((0.5f) * (fract * (fract * fract))) +
243 ((0.5f) * (fract * fract))) + fract;
244 wd = ((0.166666667f) * (fract * (fract * fract))) -
245 ((0.166666667f) * fract);
246
247 /* Calculate sin value */
248 sinVal = ((a * wa) + (b * wb)) + ((c * wc) + (d * wd));
249
250 /* Return the output value */
251 return (sinVal);
\ 0000003C 0xEE20 0x2A00 VMUL.F32 S4,S0,S0
\ 00000040 0xEE62 0x2A00 VMUL.F32 S5,S4,S0
\ 00000044 0xED9F 0x.... VLDR.W S6,??DataTable1_2 ;; 0x3e2aaaab
\ 00000048 0x.... 0x.... ADR.W R0,sinTable
\ 0000004C 0xEE10 0x1A90 VMOV R1,S1
\ 00000050 0xEE62 0x3A83 VMUL.F32 S7,S5,S6
\ 00000054 0xEB00 0x0081 ADD R0,R0,R1, LSL #+2
\ 00000058 0xEEB6 0x4A00 VMOV.F32 S8,#0.5
\ 0000005C 0xEDDF 0x.... VLDR.W S9,??DataTable1_3 ;; 0x3eaaaaab
\ 00000060 0xEEB0 0x5A63 VMOV.F32 S10,S7
\ 00000064 0xEE22 0x4A04 VMUL.F32 S8,S4,S8
\ 00000068 0xEE00 0x5A24 VMLA.F32 S10,S0,S9
\ 0000006C 0xEDD0 0x0A00 VLDR S1,[R0, #0]
\ 00000070 0xEE74 0x4A45 VSUB.F32 S9,S8,S10
\ 00000074 0xEE64 0x0AA0 VMUL.F32 S1,S9,S1
\ 00000078 0xEEF6 0x4A00 VMOV.F32 S9,#0.5
\ 0000007C 0xEEB6 0x5A00 VMOV.F32 S10,#0.5
\ 00000080 0x1D00 ADDS R0,R0,#+4
\ 00000082 0xEE62 0x4AA4 VMUL.F32 S9,S5,S9
\ 00000086 0xEE00 0x2A05 VMLA.F32 S4,S0,S10
\ 0000008A 0xEE34 0x2AC2 VSUB.F32 S4,S9,S4
\ 0000008E 0xED90 0x1A00 VLDR S2,[R0, #0]
\ 00000092 0xEEF7 0x4A00 VMOV.F32 S9,#1.0
\ 00000096 0x1D00 ADDS R0,R0,#+4
\ 00000098 0xEE32 0x2A24 VADD.F32 S4,S4,S9
\ 0000009C 0xEE42 0x0A01 VMLA.F32 S1,S4,S2
\ 000000A0 0xEDD0 0x1A00 VLDR S3,[R0, #0]
\ 000000A4 0xEEBE 0x1A00 VMOV.F32 S2,#-0.5
\ 000000A8 0x1D00 ADDS R0,R0,#+4
\ 000000AA 0xEE02 0x4A81 VMLA.F32 S8,S5,S2
\ 000000AE 0xEE34 0x1A00 VADD.F32 S2,S8,S0
\ 000000B2 0xEE40 0x3A43 VMLS.F32 S7,S0,S6
\ 000000B6 0xEE21 0x1A21 VMUL.F32 S2,S2,S3
\ 000000BA 0xED90 0x0A00 VLDR S0,[R0, #0]
\ 000000BE 0xEE03 0x1A80 VMLA.F32 S2,S7,S0
\ 000000C2 0xEE30 0x0A81 VADD.F32 S0,S1,S2
\ 000000C6 0x4770 BX LR ;; return
252
Сб июн 20, 2015 01:50:52
Сб июн 20, 2015 07:31:26
Вс июн 21, 2015 14:04:46
Вс июн 21, 2015 14:49:45
Пн июн 22, 2015 11:56:39
Вт июн 23, 2015 12:06:40
Cat писал(а): радиусом скажем метр, и длиной пару метров при разрешении 0,01 мм
Вт июн 23, 2015 21:58:49
Ср июн 24, 2015 10:40:11
es131245 писал(а):А задача не позволяет к компу подключить?
Ср июн 24, 2015 12:04:35
Cat писал(а):Задача, для которой нужна такая точность - делаю свой автономный контроллер ЧПУ, готовые варианты не устраивают либо по цене, либо по реализации.
Ср июн 24, 2015 13:28:53
pcb писал(а):А советские старые ЧПУ и нюхом не слыхивали о фпу и имели точность повыше.
Чт июн 25, 2015 12:56:02
Чт июн 25, 2015 13:06:51
Cat писал(а):Я раньше везде пихал МК, куда только можно, сейчас, когда количество знаний и опыта растет, стараюсь по максимуму делать автоматику аналоговой, предельно простой, или же беру ПЛИС. Видимо старею.
Чт июн 25, 2015 13:58:04
Чт июн 25, 2015 14:12:25
э кхм.Cat писал(а):У светодиода далеко не линейная зависимость яркости от напряжения питания
Чт июн 25, 2015 14:56:17
Чт июн 25, 2015 15:06:20
Чт июн 25, 2015 15:19:12
Чт июн 25, 2015 15:50:22
ну всему своё время.Cat писал(а):регулировки выходного тока на гальваническую установку, советскую, там два здоровых таких шкафа - один - трехфазный трансформатор с диодным мостом, второй - регулятор тока и напряжения на индуктивностях.
Cat писал(а):Пришлось второй шкафчик отправить на помойку, и делать маленький (по сравнению с ним) DC-DC преобразователь на 12 В 400А(частота преобразования 100 кГц). Современные технологии таки иногда рулят. Скоро будет запущено на проектную мощность.