в которую я раньше ручками подставлял значение k если мне нужно было входной сигнал поделить на 13.6 я вместо k записывал значение 0,0735 (1/13.6) если мне нужно было входной сигнал умножить на 11 я вместо k записывал значение 11
теперь вот пытаюсь спомощью АЦП реализовать переменное значение k
if (data.adc <= 511){ k = 512-data.adc; k = k - (k-1)*.9; /*приводим переменную в диапазоне 1-52 */ per_tmp = (long)((float)(per_tmp/k)); } else{ k = data.adc - 511; k = k - (k-1)*.95; /*приводим переменную в диапазоне 1-26,5 */ k = k - (k-1)*.9; /*приводим переменную в диапазоне 1-52 */ per_tmp = (long)((float)(per_tmp*k)); }
только посмотрите какой тип вам надо задать для переменной k. float явно не подходить - компилятор ругается Здесь манипулируя константой 0,9 можно делать растяжка диапазона. Если заменить 0,9 на 0,5 то диапазон k будет менятся с 1 по 256.
_________________ Лом - ето город в Болгарии, а не инструмент юстировки електроники.
с ошибками разобрался, но снова уткнулся в нехватку места.
Спойлер
Код:
if(per_tmp){ if (data.adc <= 511){k = 512-data.adc; k =(long)((float)( k - (k-1)*.95)); per_tmp = (long)((float)(per_tmp/k));} else{k = data.adc - 511; k =(long)((float)( k - (k-1)*.95)); per_tmp = (long)((float)(per_tmp*k));}
Код:
Microchip MPLAB XC8 C Compiler V1.20 Copyright (C) 2013 Microchip Technology Inc. License type: w Error [1250] D:\taho_675\main.c; 10. could not find space (4 bytes) for variable _per_tmp (908) exit status = 1
unsigned int k; ....... if (data.adc <= 511){k = 512-data.adc; k -= (unsigned)((float)((k-1)*9/10)); per_tmp = (long)((float)(per_tmp/k));} else{k = data.adc - 511; k -= (unsigned)((float)((k-1)*9/10)); per_tmp = (long)((float)(per_tmp*k));} .......
теперь :
Код:
Microchip MPLAB XC8 C Compiler V1.20 Copyright (C) 2013 Microchip Technology Inc. License type: w Error [1360] D:\taho_675\main.c; 72. no space for auto/param ___fldiv@exp (908) exit status = 1
Никак не могу взять в толк, зачем вообще тут флоат? Ни для управления умножением-делением он не нужен, ни для вывода на индикацию. Для отображения вполне хватит обычного формата с фиксированной точкой, то есть int в мантиссе и char в обозначении позиции точки. Порой желание написать некую конструкцию на Си выходит за границы здравого смысла.
Никак не могу взять в толк, зачем вообще тут флоат? Ни для управления умножением-делением он не нужен, ни для вывода на индикацию. Для отображения вполне хватит обычного формата с фиксированной точкой, то есть int в мантиссе и char в обозначении позиции точки. Порой желание написать некую конструкцию на Си выходит за границы здравого смысла.
Я прекрасно Вас понимаю, моя основная головная боль в том что я совсем запутался в этих всех значениях float int char и т.д. я прекрасно себе представляю картину того что мне нужно сделать, но как программно это реализовать для меня темный лес, особенно на PIC-контроллерах.
Здесь дело в точности. Вам нужно получить какой-то коефициент 4,8567 (скажем) вот и здесь нужно float (или double). k -= (unsigned)((float)((k-1)*9/10)); В етом ряде все равно приводим к целое.
Да и я как понял ета информация не въводится - да я и не смотрел что с ней потом делается.
Так: А что если сделаем другое. Берем с ADC старшие 5 битов. Сдвигаем их вправо и получаем коефициентъ с 1 до 31, если возмем 4 бита то с 1 по 15.
Ето сърое еще.
Код:
if (data.adc <= 511){k = 512-data.adc; k -= (unsigned)((k-1)*9/10); per_tmp = (long)(per_tmp/k);} else{k = data.adc - 511; k -= (unsigned)((k-1)*9/10); per_tmp = (long)(per_tmp*k);}
А так?
_________________ Лом - ето город в Болгарии, а не инструмент юстировки електроники.
Последний раз редактировалось botchin Чт май 19, 2016 15:19:28, всего редактировалось 1 раз.
Итак в этом варианте благодаря помощи botchin, получилось добиться деления и умножения с значением коэфф от 1 до 51 но только в целом числе. теперь как сделать этот коэф с плавающей запятой т.е. от 0,1 до 51,0
Подскажите как я совсем с этими типами переменных запутался
if (data.adc <= 511){k = 512-data.adc; k *=10; k -= (unsigned)((k-1)*9); //приводим к коефициента умноженном на 10 per_tmp = (long)(per_tmp/k); per_tmp *= 10; // умножаем на 10 для получения нормального коефициента } else{k = data.adc - 511; k *=10; k -= (unsigned)((k-1)*9); per_tmp = (long)(per_tmp*k); per_tmp /= 10; // делим на 10 для получения нормального коефициента }
Если не потерял где-то, что-то.
PS: Поменял код. Не работал для деления.
Да-а-а-а. Не получается. Запустил Debug. Можно желать лучшего. Теряется точность.
_________________ Лом - ето город в Болгарии, а не инструмент юстировки електроники.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения