2 / 2 / 0
Регистрация: 28.08.2016
Сообщений: 252
|
||||||
1 | ||||||
Как правильно написать функцию28.08.2016, 18:53. Показов 952. Ответов 10
Метки нет (Все метки)
Доброго времени суток. Помогите разобраться. есть такая функция:
0
|
28.08.2016, 18:53 | |
Ответы с готовыми решениями:
10
Решение системы уравнений: написать функцию, которая как параметр будет использовать другую функцию Как правильно вызвать функцию? Как правильно вызвать функцию? Как правильно завершать булевую функцию? |
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
||||||
28.08.2016, 20:05 | 2 | |||||
Alexandrit84, что у вас вообще за зверь? PORTB, PB0 и тд это какие-то глобальные переменные? может x присвоить максимальное значение по умолчанию? в какой среде отлаживаете? какой компилятор? Добавлено через 3 минуты A как объявлен? D какого типа? Добавлено через 5 минут он, датчик, как ориентируется, на конвеере есть какие-то встроенные метки? привод смещения - это что? он крутится и возвращает 2PI*R? текущее положение привода записывается, включается привод... те он все-таки работает?
0
|
2 / 2 / 0
Регистрация: 28.08.2016
Сообщений: 252
|
|
29.08.2016, 05:21 [ТС] | 3 |
Atmega32. Делаю на ней центратор для конвеерной ленты. PORTB это порт В. РВ0 это пин 0 порта В. Максимальное значение х будет известно после пуско-наладки. Пишу в AtmelStudio. Компилятор от туда же.
Переменная А объявлена глобально, т.к. используется в других функциях. Тип float. D так же float. Резистивный. Линейный датчик положения(A). Одним концом крепится к штанге, которая смещается вместе с лентой, смещая шток датчика. Второй конец крепится к раме конвеера. Привод смещения это актуатор, который двигает приводной вал конвеерав зависимости от положения конвеера. В нём есть встроеный резистивный линейный датчик положения(D). Какой то зависимости между положениями ленты и вала нету(толи кривой монтаж, толи ещё что) Привод включается, но не останавливается. Если за место х написать конкретную цифру, то всё работает без проблем. Добавлено через 7 часов 49 минут Что Вы имеете ввиду под инициализацией?
0
|
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
|||||||||||
29.08.2016, 13:29 | 4 | ||||||||||
Alexandrit84, а у вас есть отладчик в среде, чтобы видеть значения переменных по ходу дела? или может есть панель какая-нибудь куда можно отобразить
имхо у вас с float может быть проблема, либо с разными единицами измерения
почему я говорю про инициализацию. у вас во втором условии а значение x присваивается только если A>83 в первом условии. а если A меньше 83, то программа начинает проверять второе условие (D<=x-m) и чему здесь тогда равен x? NULL может сразу float x = D; только float не совсем правильно сравнивать >= лучше, как я уже говорил, привести все значения к int
1
|
2 / 2 / 0
Регистрация: 28.08.2016
Сообщений: 252
|
||||||
30.08.2016, 04:19 [ТС] | 5 | |||||
Проверяю работу в proteuse. Все переменные вывожу на LCD. Вечером сделаю как вы сказали. По результату отпишусь.
Добавлено через 13 часов 59 минут Сделал как вы сказали, результата не дало. Привод запускается, но не останавливается. Сделал кое какое изменение, объявил "х" как static:
Если А>83, переменная "x" меняется вместе с "D". Но когда А<83, "x" принимает статистическое значение, как мне и надо. И когда "D<=x-m" привод останавливается. Осталось сделать что бы это значение принимало статистический вид в рамках моего условия. Не могу понять как это сделать.
0
|
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
|
30.08.2016, 12:00 | 6 |
0
|
2 / 2 / 0
Регистрация: 28.08.2016
Сообщений: 252
|
|
30.08.2016, 16:35 [ТС] | 7 |
Допустим текущее значение D=100. При входе в условие х принимает так же значение 100. Надо что бы в х осталось именно это, начальное значение. После запуска привода, D сместится допустим на 3 миллиметра, то есть условие остановки привода будет D<=x-3. Где 3 это миллиметры, x те самые 100, а D будет равно уже 97. После остановки привода, х должна принять новое значение D=97. Тут ещё надо сделать паузу для функции, что б привод не срабатывал постоянно, а допустим, подвинул на 3 миллиметра, если через 10 минут A всё равно больше 83, снова двигаем на 3 миллиметра. Если А<83, то всё хорошо, ни чего не запускаем.
0
|
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
||||||
30.08.2016, 19:43 | 8 | |||||
Alexandrit84, так, дистанционно сложно понять.
Теорию конечных автоматов не изучали? Нарисуйте простенький КА. используйте переменную int STATE; для подобного рода задач КА, имхо, незаменимая вещь. STATE == 1; // команда пуск STATE == 2; // работа () STATE == 3; // останов (переводим STATE=4) STATE == 4; // калибровка (доводим 3 миллиметра, о которых вы писали и стоп) STATE < 0; // авария (привод стоп, питание откл и тд) и тд задайте условия перехода из состояния в состояние и поведение устройств в каждом из состояний нарисуйте, например, 7 кружочков (состояния) и стрелочками переходы(над стрелочкой подпишите условие перехода) переменную STATE вообще вынесите за main()
1
|
2 / 2 / 0
Регистрация: 28.08.2016
Сообщений: 252
|
|
30.08.2016, 19:50 [ТС] | 9 |
Интересно. Спасибо за совет. Поизучаю.))))))
0
|
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
|
30.08.2016, 21:42 | 10 |
Alexandrit84, А.Гилл "Введение в теорию конечных автоматов" (на рутрекере есть)
хотя бы первый параграф осильте - для конвеерной ленты большего и не надо
1
|
2 / 2 / 0
Регистрация: 28.08.2016
Сообщений: 252
|
|
30.08.2016, 22:11 [ТС] | 11 |
На работе есть ещё несколько проектов. Как я понял это что то типа искусственного интеллекта. Очень интересная вещь))))
0
|
30.08.2016, 22:11 | |
30.08.2016, 22:11 | |
Помогаю со студенческими работами здесь
11
Как правильно передать массив в функцию? Как правильно передавать двумерный массив в функцию Как правильно создать функцию используя макрос Как правильно передать два массива в функцию Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |