индикация процентовки на lsd скорости вращения DC коллекторного двигла.Нужна помощь
- Войдите на сайт для отправки комментариев
Чт, 08/03/2018 - 15:55
Подскажите начинающему как можно изменить переменное значения по выходу 11 на от 0 до 255(0-4.5v)
#include <TimerOne.h>
#include <LiquidCrystal.h>
// buttons code
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
// directions
#define FORWARD HIGH
#define BACKWARD LOW
// debounce time (milliseconds)
#define DEBOUNCE_TIME 90//скорость переключения повышения.понижения значений
// PINs for Pololu controller
#define PIN_STEP 11
#define PIN_DIR 13
// lookup table speed - ticks (interrupts)
const int speed_ticks[] = {0, 600, 300, 200, 150, 120, 100, 86, 75, 67, 60, 55, 50, 46, 43};
// global variables
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int actual_speed;
int actual_direction;
int ticks;
int tick_count;
int button;
boolean debounce;
unsigned long previous_time;
// custom LCD square symbol for progress bar
byte square_symbol[8] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};
// string constants
char forward_arrow[] = "->";
char backward_arrow[] = "<-";
void setup() {
// init the timer1, interrupt every 0.1ms
Timer1.initialize(90);
Timer1.attachInterrupt(timerIsr);
// init LCD and custom symbol
lcd.begin(20, 4);
lcd.setCursor(0,0);
lcd.createChar(0, square_symbol);
// pins direction
pinMode(PIN_STEP, OUTPUT);
pinMode(PIN_DIR, OUTPUT);
// initial values
actual_speed = 0;
actual_direction = FORWARD;
tick_count = 0;
ticks = 1;
debounce = false;
digitalWrite(PIN_DIR, actual_direction);
updateLCD();
}
void loop() {
// check if debounce active
if(debounce) {
button = btnNONE;
if(millis() - previous_time > DEBOUNCE_TIME) debounce = false;
} else button = read_buttons();
// if a button is pressed, start debounce time
if(button != btnNONE) {
previous_time = millis();
debounce = true;
}
// check which button was pressed
switch(button) {
case btnUP:
increase_speed();
break;
case btnDOWN:
decrease_speed();
break;
case btnLEFT:
change_direction(BACKWARD);
break;
case btnRIGHT:
change_direction(FORWARD);
break;
case btnSELECT:
emergency_stop();
break;
}
// finally update the LCD
updateLCD();
}
// increase speed if it's below the max (100)//OTSCHET OT 0+
void increase_speed() {
if(actual_speed < 100) {
actual_speed += 1;//делитель
tick_count = 0;
ticks = speed_ticks[actual_speed / 5];
}
}
// decrease speed if it's above the min (1)//OTSCHET-100
void decrease_speed() {
if(actual_speed > 1) {
actual_speed -= 1;//делитель
tick_count = 0;
ticks = speed_ticks[actual_speed / 5];
}
}
// change direction if needed
void change_direction(int new_direction) {
if(actual_direction != new_direction) {
actual_direction = new_direction;
digitalWrite(PIN_DIR, actual_direction);
}
}
// emergency stop: speed 0
void emergency_stop() {
actual_speed = 0;
tick_count = 0;
ticks = speed_ticks[actual_speed / 5];
}
// update LCD
void updateLCD() {
// print first line:
// Speed: xxxRPM -> (or <-)
lcd.setCursor(24,1);
lcd.print(actual_speed);
lcd.print("");
lcd.print("% ");
lcd.setCursor(20,1);
if(actual_direction == FORWARD) lcd.print(forward_arrow);
else lcd.print(backward_arrow);
// print second line:
// progress bar [##### ]
// 15 speed steps: 0 - 5 - 10 - ... - 100
lcd.setCursor(20,0);
lcd.print("");
for(int i = 0; i <= 19; i++) {
if(actual_speed > (5 * i) - 1) lcd.write(byte(0));
else lcd.print(" ");
}
}
// timer1 interrupt function
void timerIsr() {
if(actual_speed == 0) return;
tick_count++;
if(tick_count == ticks) {
// make a step
digitalWrite(PIN_STEP, HIGH);
digitalWrite(PIN_STEP, LOW);
tick_count = 0;
}
}
// read buttons connected to a single analog pin
int read_buttons() {
int adc_key_in = analogRead(0);
if (adc_key_in > 1000) return btnNONE;
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 195) return btnUP;
if (adc_key_in < 380) return btnDOWN;
if (adc_key_in < 555) return btnLEFT;
if (adc_key_in < 790) return btnSELECT;
}
еще один под LSD
Вставьте код нормально.
Понимаю.Праздник сегодня не у нас))))Но все таки по теме?
[quote=alex72]
Подскажите начинающему как можно изменить переменное значения по выходу 11 на от 0 до 255(0-4.5v)
никак, ардуина этого неумеет,
умеют сторонние ЦАП, или на шим RC фильтр подбирать
Если ты имел в виду вот это:
То, всё очень просто - чуть больше дозу и все значения станут "ваще, атпад!"
Как-то так:
ну, только третий на 11-ый заменить.
Будет от 0 до напряжения питания
Интересно, для чего в этом скетче pwm на пине 11 и причем тут лсд..
ТОЧНЯК.СТАРЕЮ.УСИЛИТЬ СИГНАЛ.ПРАВИЛЬНО ГОВОРЯТ ОДНА ГОЛОВА ХОРОШО А ДВЕ УЖЕ-МУТАНТ))).ОПРОБИРУЮ ДАМ ОТВЕТ
ПРИ ИЗМЕНЕНИИ ОБОРОТОВ ОТСЛЕЖИВАТЬ ИНФУ НА ДИСПЛЕЕ
УВЫ С ОПЕРАЦИОННИКОМ НЕ ТАЩИТ.МОЛЧИТ
alex72, во-первых, не нужно кричать. А во-вторых, попытайтесь вразумительно объяснить:
1. Чего Вы хотите.
2. Что у Вас получается.
3. Чем первое отличается от второго.
Мне одному кажется, что это какое-то безумие - ждать плавного изменения напряжения на выводе сигнала на операционник с выхода на степающий драйвер?
Мне одному кажется, что это какое-то безумие - ждать плавного изменения напряжения на выводе сигнала на операционник с выхода на степающий драйвер?
Я все придумывал, как бы над этим поглумиться потоньше, а ты все испортил! ;)
Я уже начал рисовать идею, что бы он в итоге степ-дрйвер свой пожег... и теперь все насмарку! А-а-абидно, однако...
)))))ПОТРЯСНО.ЭТО ВСЕ НА ЧТО ВЫ СПОСОБНЫ????.НАСКОЛЬКО Я ДУМАЮ В СКЕТЧ НУЖНО ДОБАВИТЬ ЧТО-ТО
Для начала нажмите Caps Lock на клавиатуре.
ОК ЕСЛИ СИГНАЛ ЗАПУСТИТЬ НА АНАЛОГОВУЮ ШИНУ И ПРОПИСАТЬ В ПРОГЕ ИЗМЕННЕНИЯ НА ВЫХОД?????
alex72, я Вас предупредил. Все сообщения с КАПСОМ будут удаляться. Отредактируйте свои сообщения и пишите нормальным шрифтом.
спасибо за совет.незнал это правило
Здесь про четчик оборотов на ИК сенсоре
http://samopal.pro/cnc-new-3/
В принципе ИК сенсор без проблем можно заменить оптическим или датчиком Холла
спасибо.эти варианты не подходят.ребята помогли.сделали.все работает.тему можно закрывать)