////////// WWW.EMIC.IR //////////
#include <mega16a.h> //معرفي کتابخانه ميکروکنترلر مگا 16//
#include <delay.h> //delay معرفي کتابخانه//
void main(void)
{
int i; //در روبرو يک متغير براي استفاده در برنامه تعريف شده است//
//است را خروجي کرده ايم PWM که در واقع پين خروجي موج D در زير پين 4 از پورت//
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (1<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
//از خط 27 تا 34 تنظيمات واحد تايمر/کانتر 1 ميکرو مي باشند که با توجه به تنظيمات ما در محيط کدويزارد ايجاد مي شوند//
//در زير مي توانيد توضيحات مربوط به تنظيمات رجيسترهاي تايمر/کانتر 1 ميکرو را مشاهده کنيد//
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000/000 kHz
// Mode: Fast PWM top=OCR1A
// OC1A output: Disconnected
// OC1B output: Non-Inverted PWM
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 20 ms
// Output Pulse(s):
// OC1B Period: 20 ms Width: 0/400 ms
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (1<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1A=20000; //دوره تناوب سيگنال ما را مشخص مي کند که براب با 20000 ميکرو ثانيه يا 20 ميلي ثانيه قرار داده شده است OCR1A رجيستر//
OCR1B=400; //را مشخص مي کند که براي شروع ان را بربر با 400 ميکرو ثانيه يا 0.4 ميلي ثايه قرار داده ايم PWM عرض پالس سيگنال OCR1B رجيستر//
//را بين 400 تا 2400 مقدار دهي مي کنيم تا با ايجاد عرض پالس هاي مختلف سروو موتور در زاويه هاي مختلف چرخش کند OCR1B رجيستر for در ادامه ما توسط دو حلقه//
while (1)
{
for(i=400;i<=2400;i++) { //مي ريزد OCR1B تعريف شده که از 400 تا 2400 شمارش مي کند و درون رجيستر for در روبرو يک حلقه//
OCR1B=i;
delay_ms(2);
}
for(i=2400;i>=400;i--) { //مي ريزد OCR1B روبرو برعکس قبلي است يعني از 2400 يکي يکي کم مي کند تا به 400 برسد و مقادير شمارش را درون رجيستر for حلقه//
OCR1B=i;
delay_ms(2);
}
}
}
/*
* ATmega16_Servo_Motor
* http://www.electronicwings.com
*/
#define F_CPU 8000000UL /* Define CPU Frequency e.g. here its 8MHz */
#include <avr/io.h> /* Include AVR std. library file */
#include <stdio.h> /* Include std. library file */
#include <util/delay.h> /* Include Delay header file */
int main(void)
{
DDRD |= (1<<PD5); /* Make OC1A pin as output */
TCNT1 = 0; /* Set timer1 count zero */
ICR1 = 2499; /* Set TOP count for timer1 in ICR1 register */
/* Set Fast PWM, TOP in ICR1, Clear OC1A on compare match, clk/64 */
TCCR1A = (1<<WGM11)|(1<<COM1A1);
TCCR1B = (1<<WGM12)|(1<<WGM13)|(1<<CS10)|(1<<CS11);
while(1)
{
OCR1A = 65; /* Set servo shaft at -90° position */
_delay_ms(1500);
OCR1A = 175; /* Set servo shaft at 0° position */
_delay_ms(1500);
OCR1A = 300; /* Set servo at +90° position */
_delay_ms(1500);
}
}
bout servo motors by knowing their importance in Robotics.
Code
#define F_CPU 1000000UL
#include<avr/io.h>
#include<util/delay.h>
void main()
{
//Configure TIMER1
TCCR1A|=(1<<COM1A1)|(1<<COM1B1)|(1<<WGM11); //NON Inverted PWM
TCCR1B|=(1<<WGM13)|(1<<WGM12)|(0<<CS11)|(1<<CS10); //PRESCALER=1 MODE 14(FAST PWM)
ICR1=19999; //fPWM=50Hz (Period = 20ms Standard).
DDRD|=(1<<PD4)|(1<<PD5); //PWM Pins as Out
while(1)
{
OCR1A=0; //0 degree
_delay_ms(1000);
OCR1A=600; //45 degree
_delay_ms(1000);
OCR1A=950; //90 degree
_delay_ms(1000);
OCR1A=1425; //135 degree
_delay_ms(1000);
OCR1A=1900; //180 degree
_delay_ms(1000);
OCR1A=1425; //135 degree
_delay_ms(1000);
OCR1A=950; //90 degree
_delay_ms(1000);
OCR1A=650; //45 degree
_delay_ms(1000);
}
}
#include <mega16a.h>
#include <delay.h> /* Include Delay header file */
void main(void){
DDRD=(0<<DDD7) | (0<<DDD6) | (1<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0); TCNT1 = 0; /* Set timer1 count zero */
// ICR1 = 2499; /* Set TOP count for timer1 in ICR1 register */
/* Set Fast PWM, TOP in ICR1, Clear OC1A on compare match, clk/64 */
TCCR1A = (1<<WGM11)|(1<<COM1A1);
TCCR1B = (1<<WGM12)|(1<<WGM13)|(1<<CS10)|(1<<CS11);
while(1)
{
OCR1A = 65; /* Set servo shaft at -90° position */
delay_ms(1500);
OCR1A = 175; /* Set servo shaft at 0° position */
delay_ms(1500);
OCR1A = 300; /* Set servo at +90° position */
delay_ms(1500);
}
}