Salamander 2 21 февраля, 2015 Опубликовано 21 февраля, 2015 (изменено) · Жалоба Господа, пытаюсь вывести на экранчик частоту вращения двигателя. В двигателе таходатчик, который выдает 2 импульса на оборот, ширина импульса - 50%, исходя из чего я измеряю ширину положительной полуволны (считаю, сколько мсек натикал таймер), умножаю на 4 и получаю период обращения. В этой связи, на первый взгляд формула выглядит просто: RPM=1/(tics*4)*60, где tics - щирина импульса в микросекундах. Но при подсчете в микроконтроллере выдает ноль RPM. Понятно почему - если целочисленную единицу поделить на число больше единицы, получится ноль. Как посчитать частоту вращения, если RPM и tics представлены типом unsigned int ? Ожидаемая частота - 100-3000 об/мин. Таймер в STM32F103 настроен так TIM3->PSC = 720 - 1; // clock = 100kHz TIM3->ARR = 30000 - 1; //period = 0,3sec Изменено 21 февраля, 2015 пользователем Salamander Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 21 февраля, 2015 Опубликовано 21 февраля, 2015 · Жалоба "RPM=1/(tics*4)*60, где tics - щирина импульса в микросекундах." Как только исправите ошибки в этой строке, у Вас все получится. Tip: Я подставляю ширину импульса 1 мкс в микросекундах (1), получаю 1/(1*4)*60 - явная ошибка. Значит какого-то коэффициента не хватает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 21 февраля, 2015 Опубликовано 21 февраля, 2015 · Жалоба ну да, забыл я про миллион, но сути это не меняет, вы ведь понимаете что будет если unsigned int поделить или умножить на миллион В итоге вышло вот что: RPM=1500000/tics . Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 22 февраля, 2015 Опубликовано 22 февраля, 2015 · Жалоба но сути это не меняет ... RPM=1500000/tics . Меняет, потому что теперь будет работать. Попробуйте ;) Но лучше записать тип явно RPM=1500000UL/tics; А еще лучше - сдать проверку, чтобы не происходило переполнения RPM. Вдруг из-за помех получите слишком короткий tics: if (tics>=MIN_TICS) RPM=1500000UL/tics; else RPM=0xffff; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
akl 0 24 февраля, 2015 Опубликовано 24 февраля, 2015 · Жалоба Более общее выражение для определения скорости вращения RPM=60*Fo*Nx/nox*K, где RPM - скорость вращения [об/мин] Fo - частота тактирования счётчика Nx - целое число периодов измеряемой величины nox - значение счётчика за Nx K - коэффициент передачи таходатчика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться