Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Электроника - это просто Теоретические и практические вопросы для начинающих электронщиков.

 
Опции темы

Помогите новичку запрограммировать контроллер

Непрочитано 09.03.2012, 23:18  
кустомер
Почётный гражданин KAZUS.RUN
 
Аватар для кустомер
 
Регистрация: 29.12.2009
Сообщений: 4,380
Сказал спасибо: 608
Сказали Спасибо 1,720 раз(а) в 918 сообщении(ях)
кустомер на пути к лучшему
По умолчанию Re: Помогите новичку запрограммировать контроллер

Сообщение от lukosin Посмотреть сообщение
кустомер, ЭДС идет импульсами, частота которых зависит только от оборотов.
Сама ЭДС - постоянна при постоянной скорости.
Импульсы зависят от качества коллектора, и они могут быть, а могут и не быть; могут пропускаться, могут умножаться из-за искрения, и проч.
Сообщение от lukosin Посмотреть сообщение
Ваша же идея про ЭДС
поэтому моя идея была - мерять саму ЭДС, а не работу коллектора при ее помощи
А кстати! - на этом принципе (измерение ЭДС ротора) были основаны стабилизаторы скорости двигателя в старых кассетных магнитофонах)))))
И для этого специальные микросхемы были...
А тогда еще можно по стандартной схеме стабилизировать скорость мотора и отслеживать время)))) Всё просто
Реклама:

Последний раз редактировалось кустомер; 09.03.2012 в 23:27.
кустомер вне форума  
Непрочитано 10.03.2012, 13:56  
@om
Частый гость
 
Регистрация: 11.04.2011
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
@om на пути к лучшему
По умолчанию Re: Помогите новичку запрограммировать контроллер

Конкретизируй задачу: тебя интересует написание программы на С или сам процесс компиляции и программирования??
Если нужен только конечный результат(Вращение ШД), то можно обойтись схемой на жесткой логике.
@om вне форума  
Непрочитано 10.03.2012, 14:15  
vik728
Прохожий
 
Регистрация: 04.02.2011
Сообщений: 4
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
vik728 на пути к лучшему
По умолчанию Re: Помогите новичку запрограммировать контроллер

Попробую ответить автору топика, если еще актуально..
Как говорится "...Пастернака не читал , но скажу..."
Ни в Си ни в АВР не силен , но попробую объяснить , знатоки поправят,если что..

//************************************************** *************************
// File Name : upstepper.c
// Version : 1.0
// Description. : Transistor as Switch: Simple Unipolar Stepper
// Motor Driver - Full Step Method
// Author : RWB
// Target : ATTiny13
// Compiler : AVR-GCC 4.3.2; avr-libc 1.6.2 (WinAVR 20090313)
// IDE : Atmel AVR Studio 4.17
// Programmer : Atmel AVRISPmkII
// Last Updated : 03 Nov 2010
//************************************************** *************************

#include ‹avr/io.h›
#include ‹util/delay.h›
#include ‹avr/interrupt.h›

// Unipolar Stepper Motor CW/CCW Stepping Sequence
#define MAX_STEP 4

// Здесь определяем два массива, в каждом по четыре значния
// которые будем по очереди выводить в порт.Один массив крутит в
// одну сторону, другой - в другую. Выводится по две единицы,
// т.е запитаны будут одновременно две фазы.Можно поигратся
//и выводить по одной
//единице и сравнить момент на валу ШД.

unsigned char cwstep_seq[MAX_STEP]= {0b00000110,
0b00000011,
0b00001001,
0b00001100};

unsigned char ccwstep_seq[MAX_STEP]= {0b00001100,
0b00001001,
0b00000011,
0b00000110};
volatile unsigned char step_index; //здесь номер включенной фазы -1.2.3.4
volatile unsigned int ovftimes; //число шагов
volatile unsigned char status; //определяет направление вращения

//Это подпрограмма обработки прерывания по переполнению таймера 0
ISR(TIM0_OVF_vect)
{
static unsigned int count=1;
//Крутим ШД если статус = 0 в одну
// если 1 - в другую сторону
count++;

// if (count ›= ovftimes) {

//Здесь мне кажется надо так, или я туплю?

if (count ‹= ovftimes) {
cli(); // Disable Interrupt - Запрет прерываний

// Stepping Output
if (status)
PORTB = ccwstep_seq[step_index++];
else
PORTB = cwstep_seq[step_index++];

if (step_index ›= MAX_STEP)
step_index=0;
} А здесь верно (поправьте, если не прав)
count=0; // Reset Count
TCNT0=0; // Start counter from 0
sei(); // Enable Interrupt
// } И скобочка кажется не верно
}
//Основная программа
int main(void)
{
//Инициализируем порты

// Initial I/O
DDRB = 0b00001111; // Set PB0, PB1, PB2, and PB3 as Output, Others as Input
PORTB = 0b00000000; // Reset PORTB Output
//Инициализируем АЦП

// Set ADCSRA Register on ATTiny13
ADCSRA = (1‹‹ADEN) | (1‹‹ADPS2) | (1‹‹ADPS1);
ADCSRB = 0b00000000;

// Set ADMUX to PB4 (ADC2)
ADMUX=0b00000010;

// Disable Digital Input on PB4 (ADC2)
DIDR0=0b00001000;

//Инициализируем Таймер0 - работа от внутреннего тактового генеретора
// с предделителем на 8

// Initial TIMER0
TCCR0A=0b00000000; // Timer/Counter 0 Normal Operation
TCCR0B=(1‹‹CS01); // Use prescaller: Clk/8 with 9.6 MHz Internal Clock
TCNT0=0; // Start counter from 0
TIMSK0=(1‹‹TOIE0); // Enable Counter Overflow Interrupt

step_index=0;
ovftimes=10;
status=0; // 0 - CW, 1 - CCW

sei(); // Enable Interrupt

// Бесконечный цикл определяет значение напряжения
//на входе АЦП в зависимоти от положения движка
//потенциометра и результ. заносится в переменную
//ovftimes , если значение больше 800,
//направление вращения меняется на противоположное -status^=0x01


for(; { // Loop Forever
// Start conversion by setting ADSC on ADCSRA Register
ADCSRA |= (1‹‹ADSC);

// wait until convertion complete ADSC=0 -› Complete
while (ADCSRA & (1‹‹ADSC));

// Get the ADC Result
ovftimes = ADCW;

if (ovftimes › 800)
status^=0x01; // Toggle the Direction

_delay_ms(50);
}
return 0; // Standard Return Code
}

/* EOF: upstepper.c */

Если вам нужно только поочередное вращение в одну и другую сторону программа будет выглядеть примерно так:


#include ‹avr/io.h›
#include ‹util/delay.h›
#include ‹avr/interrupt.h›

// Unipolar Stepper Motor CW/CCW Stepping Sequence
#define MAX_STEP 4

unsigned char cwstep_seq[MAX_STEP]= {0b00000110,
0b00000011,
0b00001001,
0b00001100};

unsigned char ccwstep_seq[MAX_STEP]= {0b00001100,
0b00001001,
0b00000011,
0b00000110};
volatile unsigned char step_index;
volatile unsigned int ovftimes;
volatile unsigned char status;

ISR(TIM0_OVF_vect)
{
static unsigned int count=1;

count++;
if (count ‹= ovftimes) {
cli(); // Disable Interrupt

// Stepping Output
if (status)
PORTB = ccwstep_seq[step_index++];
else
PORTB = cwstep_seq[step_index++];

if (step_index ›= MAX_STEP)
step_index=0;
}
count=0; // Reset Count
TCNT0=0; // Start counter from 0
status^=0x01;
sei(); // Enable Interrupt
//}
}

int main(void)
{
// Initial I/O
DDRB = 0b00001111; // Set PB0, PB1, PB2, and PB3 as Output, Others as Input
PORTB = 0b00000000; // Reset PORTB Output

// Initial TIMER0
TCCR0A=0b00000000; // Timer/Counter 0 Normal Operation
TCCR0B=(1‹‹CS01); // Use prescaller: Clk/8 with 9.6 MHz Internal Clock
TCNT0=0; // Start counter from 0
TIMSK0=(1‹‹TOIE0); // Enable Counter Overflow Interrupt

step_index=0;
ovftimes=100; // Изменяя это значение, меяем колич. шагов
//в ту или другую сторону

status=0; // 0 - CW, 1 - CCW

sei(); // Enable Interrupt

for(; { //Крутим пустой цикл

}
return 0; // Standard Return Code
}

/* EOF: upstepper.c */

Последний раз редактировалось vik728; 10.03.2012 в 16:21.
vik728 вне форума  
Непрочитано 10.03.2012, 15:44  
lukosin
Частый гость
 
Регистрация: 23.06.2006
Сообщений: 42
Сказал спасибо: 1
Сказали Спасибо 8 раз(а) в 5 сообщении(ях)
lukosin на пути к лучшему
По умолчанию Re: Помогите новичку запрограммировать контроллер

Как интересно получилось! Как будто шаговый двигатель, упомянутый в ПЕРВОМ посте, надо поставить вместо коллекторного движка для автозеркала, упомянутого в 14 посте.
А для шагового двигателя обязательно надо знать длительность импульса, максимальную частоту и желательно угол поворота на один шаг. Иначе можно либо сжечь его либо момент будет слабый.
lukosin вне форума  
Непрочитано 10.03.2012, 15:52  
AlexIz60
Частый гость
 
Регистрация: 04.02.2009
Сообщений: 20
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
AlexIz60 на пути к лучшему
По умолчанию Re: Помогите новичку запрограммировать контроллер

Ну, да это для топикстартёра.
AlexIz60 вне форума  
Непрочитано 10.03.2012, 16:12  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: Помогите новичку запрограммировать контроллер

Предлагаю для начала заменить attiny13 на attiny45 или вообще на atmega8 и пойти в гугл с ключевым arduino
whoim вне форума  
Непрочитано 10.03.2012, 16:26  
AlexIz60
Частый гость
 
Регистрация: 04.02.2009
Сообщений: 20
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
AlexIz60 на пути к лучшему
По умолчанию Re: Помогите новичку запрограммировать контроллер

Сообщение от whoim Посмотреть сообщение
Предлагаю для начала заменить attiny13 на attiny45 или вообще на atmega8 и пойти в гугл с ключевым arduino
А цель замены?
AlexIz60 вне форума  
Непрочитано 10.03.2012, 18:53  
кустомер
Почётный гражданин KAZUS.RUN
 
Аватар для кустомер
 
Регистрация: 29.12.2009
Сообщений: 4,380
Сказал спасибо: 608
Сказали Спасибо 1,720 раз(а) в 918 сообщении(ях)
кустомер на пути к лучшему
По умолчанию Re: Помогите новичку запрограммировать контроллер

Предлагаю заменить контроллер на PIC16F84 + HA13408 и воспользоваться моей программой на PicBasic Pro.

Программа управляет ШД по командам, посылаемым от компьютера через COM-порт.
Код:
'=================================================  ===================
'   PIC16F84         программа: работа с COM и ШД
'=================================================  ===================
'
'
' конт  PIN       что подключается
' -------------------------------------------------------
' 17: PORTA.0 - фаза 1 инверсн.
' 18: PORTA.1 - фаза 2 инверсн.
'  1: PORTA.2 - фаза 4 инверсн.
'  2: PORTA.3 - фаза 3 инверсн.
'                                фазы работают на м/сх HA13408 
'  3: PORTA.4 - неиспользуемый выход
'
'  6: PORTB.0 - TxD (3) через резистор 22к.
'  7: PORTB.1 - RxD (2) через резистор 1к.
'  8: PORTB.2 - 
'  9: PORTB.3 - 
' 10: PORTB.4 - 
' 11: PORTB.5 - 
' 12: PORTB.6 - 
' 13: PORTB.7 - 
'
' ------------+-----------------------------------------
' 16: CLKIN   |     Кварц    Конденсаторы    Режим
' 15: CLKOUT  |     4 МГц       20  пФ        HS
'     _____   +-----------------------------------------
'  4: сброс   |                4.7 ком
' ------------+-----------------------------------------
' 14: +5V     |
' ------------+
' 5:земля,общ.|   Разъем COM (D9F) - контакт 5
' -------------
'=================================================  =================================
'Параметры обмена по COM

DEFINE DEBUGIN_REG PORTB
DEFINE DEBUG_REG PORTB
DEFINE DEBUGIN_BIT 0
DEFINE DEBUG_BIT 1
DEFINE DEBUG_BAUD 2400
' 1 - прямое соединение, 0 - через инвертирующую развязку (норм.)
DEFINE DEBUGIN_MODE 1
DEFINE DEBUG_MODE 1

'Инициализация портов
TRISA = 0 : PORTA = %1111
OPTION_REG.7 = 0		'подтяжка входов PORTB
TRISB = %11111101 : PORTB = 0



' объявление переменных

      i           VAR word
      j           VAR byte
      COMchar     VAR byte               'байт, принятый по COM

      sign        VAR byte               'знак + - к distance
      distance    VAR word               'количество шагов
      speed       VAR byte               'задержка на каждый шаг 

      phases      VAR byte               'состояние фаз


'инициализация переменных
distance=1 : sign="+" : phases=14
DEBUGIN 10, begin, [COMchar] 'инициализация COM
begin:

'           начало выполнения
DEBUG "E0" 'индикация запуска

maincycle:

'Прием по COM
DEBUGIN 100, quitRxD, [COMchar]
SELECT CASE COMchar

CASE "L","l"
'принимается параметр в форме L+00123 например.
  DEBUGIN 100, errRxD2, [sign, DEC5 distance]
'проверка, что принятая дистанция не 0 и что знак присутствует
  IF distance=0 THEN errRxD3
  IF sign‹›"-" AND sign‹›"+" THEN errRxD4
  
  DEBUG "L", sign, DEC5 distance  'ответ: возвращаем принятую дистанцию (для возможности контроля)

CASE "T","t"
' прием времени шага в форме T020 например.
  DEBUGIN 100, errRxD2, [DEC3 speed]
  DEBUG "T", DEC3 speed 'ответ: возвращаем принятое время шага

CASE "?"
' запрос текущих величин. На вопросительный знак возвращает компьютеру дистанцию и время шага
  DEBUG "L", sign, DEC5 distance, "T", DEC3 speed

CASE "S","s"
' запуск движения
'----------------------------------------------------------------------------------
  DEBUG "S"

  FOR i=1 TO distance

    IF sign ‹› "-" THEN
     'шаг в плюс
      LOOKUP (phases & 15), [14,14,14,11,14,7,14,3,14,14,14,10,13,5,12,14], phases
    ELSE
     'шаг в минус
      LOOKUP (phases & 15), [14,14,14,7,14,13,14,5,14,14,11,3,14,12,10,14], phases
    ENDIF
    phases.4=PORTA.4 : PORTA=phases	    'сохранение PORTA.4

      FOR j=1 TO speed
        'задержка, создающая время шага
        PAUSEUS 498
      NEXT j

  NEXT i

  DEBUG "OK"
'-------------------------------------------------------------------------

CASE "E","e"
' команда "включить ток"
  phases.4=PORTA.4 : PORTA=phases
  DEBUG "OK"   'ответ: OK

CASE "D","d"
'команда "отключить ток"
  PORTA = PORTA OR %1111
  DEBUG "OK"

CASE ELSE
  DEBUG "E1"  'неизвестная команда
END SELECT
GOTO quitRxD  'обход фрагмента сообщений об ошибках


' отправки кодов ошибок
errRxD2:
  DEBUG "E2"  'таймаут на вводе числа (не хватает знаков)
GOTO quitRxD
errRxD3:
  DEBUG "E3"  'нулевое количество шагов
GOTO quitRxD
errRxD4:
  DEBUG "E4"  'отсутствует знак

quitRxD:



' всё! Уход снова на прием команд по COM.

Goto maincycle


End

'=================================================  =======================
' написано без использования подпрограмм для экономии места в стеке
'(под будущие подпрограммы)

Последний раз редактировалось кустомер; 10.03.2012 в 19:03.
кустомер вне форума  
Непрочитано 10.03.2012, 19:08  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: Помогите новичку запрограммировать контроллер

Для ардуино есть готовые библиотеки, где управление мотором - парой команд)
whoim вне форума  
Непрочитано 10.03.2012, 19:21  
кустомер
Почётный гражданин KAZUS.RUN
 
Аватар для кустомер
 
Регистрация: 29.12.2009
Сообщений: 4,380
Сказал спасибо: 608
Сказали Спасибо 1,720 раз(а) в 918 сообщении(ях)
кустомер на пути к лучшему
По умолчанию Re: Помогите новичку запрограммировать контроллер

В PBP тоже парой команд ("в плюс" и "в минус") как можно видеть в моей программе
Остальное - обвязка для общения с управляющим компом))))))
кустомер вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите запрограммировать микросхему AT49LV1614 Vitek72 Микроконтроллеры, АЦП, память и т.д 0 18.08.2011 11:14
Помогите запрограммировать синтезатор ADF4117BRU alexjob Цифровые сигнальные процессоры 1 27.06.2008 11:52
Помогите запрограммировать PIC16F873 ESWANT Микроконтроллеры, АЦП, память и т.д 2 10.03.2007 13:03
Помогите запрограммировать КР1878ВЕ1 R_V_A Микроконтроллеры, АЦП, память и т.д 12 10.07.2006 16:03
Нужно запрограммировать контроллер CY7C63723 Michael N Микроконтроллеры, АЦП, память и т.д 2 28.10.2004 17:56


Часовой пояс GMT +4, время: 10:21.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.