роботы робототехника микроконтроллеры


 Страниц (2): « 1 [2]   

> Описание: )
beam Post Id



Главнокомандующий


Сообщений всего: 278
Дата рег-ции: Дек. 2009  



=)))я программно немогу понять что писать,что делать?
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



почитать про регистры, которые отвечают за ШИМ.
 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



CODE:

/* **********************************

ШИМ 4000 Hz на MK ATmega8 8000000 Hz

********************************** */

#include <avr/io.h>
#include <util/delay.h>

int main(void) /* начало основной программы */
{

/* настройка портов */
DDRB |= (1<<1); /* PB1 сконфигурировать как выход, OC1A */
DDRB |= (1<<2); /* PB2 сконфигурировать как выход, OC1B */


/* ===== настройка Timer/Counter 1 ===== */

/* Timer/Counter 1 Control Register A */
/* регистр управления таймером/счетчиком 1 А */
/* биты регистра: COM1A1 COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10 */
TCCR1A=0b10100001;

/* Timer/Counter 1 Control Register B */
/* регистр управления таймером/счетчиком 1 В */
/* биты регистра: ICNC1 ICES1 Reserved WGM13 WGM12 CS12 CS11 CS10 */
TCCR1B=0b00001010;

/* выбран режим Fast PWM, 8-bit [ WGM13=0 WGM12=1 WGM11=0 WGM10=1 ] */
/* максимальное значение таймера/счетчика 1 в этом режиме равно 0x00FF */
/* предделитель таймера/счетчика 1 равен 8 [ CS12=0 CS11=1 CS10=0 ] */
/* ШИМ выдается на OC1A (PB1) [ COM1A1=1 COM1A0=0 ] и OC1B (PB2) [ COM1B1=1 COM1B0=0 ] */

/* Timer/Counter 1 */
/* установка начального значения таймера/счетчика 1 */
TCNT1H=0x00; /* старший байт */
TCNT1L=0x00; /* младший байт */

/* Input Capture Register */
/* регистр захвата ( в выбранном режиме ШИМ не используется ) */
ICR1H=0x00; /* старший байт */
ICR1L=0x00; /* младший байт */

/* Output Compare Register А */
/* регистр сравнения А */
/* установка значения скважности для OC1A (PB1) */
OCR1AH=0x00; /* старший байт */
OCR1AL=0xF0; /* младший байт */

/* Output Compare Register В */
/* регистр сравнения В */
/* установка значения скважности для OC1B (PB2) */
OCR1BH=0x00; /* старший байт */
OCR1BL=0x0F; /* младший байт */

/* ===================================== */


while(1) /* бесконечный цикл */
{

/* пример управления скважностью */
_delay_ms(1000); /* ждем 1 секунду */
OCR1BL=0xF0; /* скважность близка к 100% */
_delay_ms(1000); /* ждем 1 секунду */
OCR1BL=0x80; /* скважность близка к 50% */
_delay_ms(1000); /* ждем 1 секунду */
OCR1BL=0x0F; /* скважность близка к 0% */

} /* закрывающая скобка бесконечного цикла */

} /* закрывающая скобка основной программы */

(Отредактировано автором: 19 Августа, 2010 - 19:51:52)

 
 Top
beam Post Id



Главнокомандующий


Сообщений всего: 278
Дата рег-ции: Дек. 2009  



mihail спасибо ограмное за код,работае нормально...я вот тоже с горем пополам и спомошью информации которую нарыл по интернету кое што написал..........получилось только на ножке ПБ1 установить 25%-ный ШИМ

#include <mega8.h>
#include <delay.h>


char pwm = 10; // Величина ШИМ начальная PWM в %
u32 pwm_val; // для хранения величины ШИМ PWM в 1/1024
void main(void)
{

PORTA=0x00;
DDRA=0x00;

PORTB=0x00;
DDRB=0x06;
PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;

TCCR0=0x00;
TCNT0=0x00;

TCCR1A=0xA3;
TCCR1B=0x09;

настройка таймера_1
TCCR1A=0xA3; // 1010 0011

TCCR1B=0x09;

TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;

//установить величину ШИМ на PB1
OCR1AH=0x00;
OCR1AL=0x00;

// установить величину ШИМ на PB2
OCR1BH=0x00;
OCR1BL=0x00;

UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x03;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

MCUCR=0x00;
MCUCSR=0x00;

ACSR=0x80;
SFIOR=0x00;

OCR1BH = 0x00; // PWM(PB2) OCR1B / 10.24 (%)
OCR1BL = 0xFF; // PWM(PB2) 255 / 10.24 = 24.9 (%)

while (1){

if (pwm > 102) { //если ШИМ уже более 100 %
pwm = 0; // обнулить величину ШИМ
};

pwm_val = ((1023 * (u32)pwm)/100);
// перевели % в 1024-е доли

printf("PWM %u %c\n",pwm,'%'Подмигивающий;
// вывели новое значение ШИМ в %

// pwm_val - это число от 0 до 1023
// PWM(PB1) = OCR1A / 10.24 (%)
OCR1AH = (char)(pwm_val>>8);
OCR1AL = (char)pwm_val;

pwm += 10; //увеличим ШИМ на 10%

delay_ms(20);

};

}
 
 Top
Pashgan Post Id


Лейтенант


Сообщений всего: 31
Дата рег-ции: Март 2010  



Вот... может кому пригодится.
Программный ШИМ на таймере Т0. Программа управляет сервоприводом фирмы Parallax.
Скачать файл: Servo.rar
Скачан раз: 318
 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



Pashgan
Тактовая частота микроконтроллера 16 MHz. Программа создает Fast PWM. Период составляет около 20 ms. Частота около 50 Hz. Продолжительность импульса от 400 us до 2100 us. Правильно ли я понял работу программы? Если не ошибаюсь, это стандартные параметры управления сервоприводами?

(Отредактировано автором: 03 Октября, 2010 - 01:18:36)

 
 Top
Страниц (2): « 1 [2]
« Обо всем »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru