|
ШИМ для сервомашинки на attiny13 |
|
|
|
May 29 2013, 13:47
|
Группа: Участник
Сообщений: 10
Регистрация: 24-05-13
Пользователь №: 76 963

|
не работает, поворачивается в одно положение только. вот такой выход нашли: while (1){ if (!PINB.0){ //Кнопка нажата if (delay>1000) delay-=10; PORTB.1 = 1; delay_us(delay); PORTB.1 = 0; delay_us(20000-delay); } else{ //Кнопка отпущена if (delay<2000) delay+=10; PORTB.1 = 1; delay_ms(delay); PORTB.1 = 0; delay_ms(20000-delay); } }; }
|
|
|
|
|
May 31 2013, 16:33
|
Группа: Участник
Сообщений: 10
Регистрация: 24-05-13
Пользователь №: 76 963

|
спасибо, промаделировал все нормально спаял схему, прошили мне МК. подключаю, не пашет. просто 1 выдает и не реагирует, в чем может быть дело? настройки при заливки не верны не верны ? если так то не мог бы подсказать фьюзы как правильно настроить? скинул фото схемки, фаил с протеуса, и вот то что в мк залили #include <tiny13.h> #include <delay.h> // Declare your global variables here void main(void) { // Declare your local variables here // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initialization // Port B initialization // Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=In // State5=0 State4=0 State3=0 State2=0 State1=0 State0=P PORTB=0x01; DDRB=0x3E; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=0x00; TCCR0B=0x00; TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // External Interrupt(s) initialization // INT0: Off // Interrupt on any change on pins PCINT0-5: Off GIMSK=0x00; MCUCR=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=0x00; // Analog Comparator initialization // Analog Comparator: Off ACSR=0x80; ADCSRB=0x00; int delay=1500; while (1){ if (!PINB.0){ //Кнопка нажата if (delay>1000) delay-=10; PORTB.1 = 1; delay_us(delay); PORTB.1 = 0; delay_us(20000-delay); } else{ //Кнопка отпущена if (delay<2000) delay+=10; PORTB.1 = 1; delay_ms(delay); PORTB.1 = 0; delay_ms(20000-delay); } }; } http://www.fayloobmennik.net/2901046
|
|
|
|
|
May 31 2013, 21:31
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Скажите, какую частоту надо заказывать PWM для шагового дивигателя? С программированием мне всё ясно, но непонятно, из каких соображений выбирать частоту.
Метод тыка показывает, что на самой медленной частоте (31 Гц), на которую мне хватает делителя, шаговый двигтель крутится, а на 10 КГц стоит, хотя на выходе МК то же самое среднее напряжение (если мерить обычным тестером). Видимо частота 10 КГц великовата для драйвера (L293D), а может быть и двигателя. А сколько ему/им надо, про то в даташите не написано.
|
|
|
|
|
Jun 1 2013, 05:39
|
Группа: Участник
Сообщений: 10
Регистрация: 24-05-13
Пользователь №: 76 963

|
kovigor извините, но я впервые сталкиваюсь с этими вопросами, при самостоятельном изучении не вышло ничего хорошего, а сроки поджимают. Вот и спрашиваю у знающих людей в чем моя ошибка?
Xenia, я собираюсь управлять сервомашинкой, необходимо 2 положения крайнее левое и крайнее правое. для этого на управляющий вывод необходимо подавать импульс 1 или 2 мс. через каждые 20мс. программно выставлены задержки на эти величины, так что думаю что для сервы все равно на какой частоте работает МК.
|
|
|
|
|
Jun 1 2013, 07:14
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(evgenui @ Jun 1 2013, 08:39)  при самостоятельном изучении не вышло ничего хорошего, а сроки поджимают. Вот и спрашиваю у знающих людей в чем моя ошибка? Конечно, потому и не вышло - вы не учитесь, а пишете сообзщения на форумы. Задача тривиальна, решается за день. Почему у всех "вышло", а у вас - нет ??? Плюс стиль сообщений - сообщения написаны безграмотно, крайне небрежно, по виду их можно судить о полном неуважении к тем, кому они предназначаются. Одно слово "промаделировал" как нельзя лучше говорит о том, сколько книг в своей жизни вы прочли (и не только по специальности). Поверьте, первое же подобное сообщение напрочь отбивает охоту вам помогать. Так что мой вам совет - откройте, наконец, книжку и даташит, выясните, как решается ваша задача, и решите ее сами. Помочь вам я бы мог, но не сделаю этого ради вас же, ибо такая помощь не будет для вас полезной. Учитесь работать самостоятельно ...
|
|
|
|
|
Jun 8 2013, 20:12
|

Группа: Участник
Сообщений: 11
Регистрация: 16-02-07
Пользователь №: 25 420

|
Здравствуйте! Нашел эту тему и решил не заводить свою. Задача котторую я хотел решить схожая, но я хотел ее решить непременно в прерываниях для того чтобы был точнее счет... Подробнее. Микросхема атмега48, таймер который использую т2 (1байтный) режим таймера нормал (обычный счет без обнуления по достижении ОСР) но при этом я использую прерывание по ОСР0А. Частоту для светодиода задал 976 Гц ОСР2А задаю регулятором (инкрементным энкодером) общая частота 3.8 Гц (976/256=3,81). В полной программе с функцией обработки энкодера и 2-мя прерываниями, диод помаргивает неравномерно, при этом я ничего не трогаю (энкодер). Для того чтобы понятно было как это выглядит привожу видео. Если делаю программу только прерывания, то никаких помаргиваний, равномерно дрожит своими 3.8 герцами, но "чистая" программа без основной части то мне не нужна! Прошу помощи. В основной части программы вызов функции изменения reg и отображение значений старших бит (вывод на светодиоды, 5 старших бит). в данном листинге нет присвоения ОСР2А каких либо значений но и в этом случае свечение не равномерное! На другом форуме задавал этот вопрос, предложили сменить переменную (энкодера) на volatile, немного меньше стали подергивания (или мне показалось) но полностью не решилась проблеммаКод char serv_num=1, count, old_reg, new_reg;
volatile char reg=0x0f; void regul (void) { if (old_reg==0) {if(new_reg == 2) reg++; if(new_reg == 1) reg--; } } interrupt [TIM2_OVF] void timer2_ovf_isr(void) { PORTB.0 = 1; }
// Timer 2 output compare interrupt service routine interrupt [TIM2_COMPA] void timer2_compa_isr(void) { PORTB.0 = 0; }
void main(void) { // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+
#endif
PORTB=0x00; DDRB=0xFF;
PORTC=0x00; DDRC=0x00;
PORTD=0xC0; DDRD=0x3F;
// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 976 Hz // Mode: normal // OC0A output: Disconnected // OC0B output: Disconnected
TCCR0A=0x00; TCCR0B=0x05; TCNT0=0x00; OCR0A=0x00; OCR0B=0x00;
// Timer/Counter 2 initialization // Clock source: System Clock // Clock value: 976 Hz // Mode: normal // OC2A output: Disconnected // OC2B output: Disconnected
ASSR=0x00; TCCR2A=0x00; TCCR2B=0x07; TCNT2=0x00; OCR2A=0x0f; OCR2B=0x00;
// External Interrupt(s) initialization // INT0: Off // INT1: Off
EICRA=0x00; EIMSK=0x00; PCICR=0x00;
// Timer/Counter 0 Interrupt(s) initialization TIMSK0=0x01;
// Timer/Counter 2 Interrupt(s) initialization TIMSK2=0x03;
// Global enable interrupts
#asm("sei")
while (1) { new_reg = 2*!PIND.6+!PIND.7; if (old_reg!=new_reg) regul(); old_reg=new_reg;
PORTB.5 = (reg-reg%128)/128; PORTB.4 = (reg-reg%64)/64; PORTB.3 = (reg-reg%32)/32; PORTB.2 = (reg-reg%16)/16; PORTB.1 = (reg-reg%8)/8; OCR2A = reg;
}; }
Сообщение отредактировал Andrikll - Jun 9 2013, 13:05
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|