PIC 16F877 ile POT yardımıyla STEP MOTOR açı kontrolü + LCD açı değeri

ziya202

Üye
Katılım
21 Mar 2022
Mesajlar
1
Puanları
1
Yaş
24
Selamünaleyküm iyi günler,

ben 16F877 PIC ile pot yardımıyla STEP motor(NEMA17) kontrol etmek istiyorum.

Çalışması şu şekilde potansiyometre kaç derece dönerse step motorda o kadar dönecek sağa veya sola
aynı zamanda döndüğü açı değeri LCD’de yazacak. Kod kısmında sıkıntı yaşıyorum yardımcı olabilecek arkadaşlar var mı acaba ?

Step motoru L298 motor sürücü ile kontrol edeceğim
223CA036-CEF1-4E33-9670-960F8B5201FE.jpeg

Başka bir arkadaşının işine yarayacaksa,
aynı çalışma şeklinin SERVO MOTOR kontrolü için olan kodlar;

// CONFIG
#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#define M1 RD0
#define RW RD3
#define RS RD2
#define EN RD1
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7
#define _XTAL_FREQ 4000000
#include <xc.h>
#include<LCD.h>
#include<stdio.h>

unsigned int duty_sure ;
unsigned int sayici1;
unsigned int analog_deger1;
unsigned int adc_bilgi(unsigned char kanal)
{
if(kanal>7)
return 0;
ADCON0&=0B11000101;
ADCON0|=kanal<<3;
__delay_ms(2);
GO_nDONE=1;
while(GO_nDONE);
return((ADRESH<<8)+ADRESL);
}
void __interrupt() kesme(void)
{
if(T0IF==1)
{
TMR0=231;
T0IF=0;
sayici1++;

}
if(sayici1>=duty_sure)
{
M1=0;
}
if(sayici1>=(200-duty_sure))
{
M1=1;
sayici1=0;
}

}


void main(void)
{
TRISA=0XFF;
OPTION_REG=0B00000010;
ADCON0=0B10000001;
ADCON1=0B10000000;
TRISD=0X00;
PORTD=0X00;
TMR0=231;
TMR0IE=1;
TMR0IF=0;
GIE=1;
PEIE=1;
Lcd_Init();
Lcd_Clear();

char dizi[20];

while(1)
{
analog_deger1=adc_bilgi(0)*20/1023;
duty_sure= analog_deger1;
__delay_ms(100);
Lcd_Set_Cursor(1,1);
Lcd_Write_String("Masa 7 ");
sprintf(dizi,"motor adimi =%d",duty_sure);
Lcd_Set_Cursor(2,1);
Lcd_Write_String(dizi);
__delay_ms(100);


}


}
 
Mutlak değer alabilmeniz için geri besleme
olmalı bence.
Servo ile yapmanız daha mantıklı olur.
 
Selamünaleyküm iyi günler,

ben 16F877 PIC ile pot yardımıyla STEP motor(NEMA17) kontrol etmek istiyorum.

Çalışması şu şekilde potansiyometre kaç derece dönerse step motorda o kadar dönecek sağa veya sola
aynı zamanda döndüğü açı değeri LCD’de yazacak. Kod kısmında sıkıntı yaşıyorum yardımcı olabilecek arkadaşlar var mı acaba ?

Step motoru L298 motor sürücü ile kontrol edeceğim
Başka bir arkadaşının işine yarayacaksa,
aynı çalışma şeklinin SERVO MOTOR kontrolü için olan kodlar;

// CONFIG
#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#define M1 RD0
#define RW RD3
#define RS RD2
#define EN RD1
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7
#define _XTAL_FREQ 4000000
#include <xc.h>
#include<LCD.h>
#include<stdio.h>

unsigned int duty_sure ;
unsigned int sayici1;
unsigned int analog_deger1;
unsigned int adc_bilgi(unsigned char kanal)
{
if(kanal>7)
return 0;
ADCON0&=0B11000101;
ADCON0|=kanal<<3;
__delay_ms(2);
GO_nDONE=1;
while(GO_nDONE);
return((ADRESH<<8)+ADRESL);
}
void __interrupt() kesme(void)
{
if(T0IF==1)
{
TMR0=231;
T0IF=0;
sayici1++;

}
if(sayici1>=duty_sure)
{
M1=0;
}
if(sayici1>=(200-duty_sure))
{
M1=1;
sayici1=0;
}

}


void main(void)
{
TRISA=0XFF;
OPTION_REG=0B00000010;
ADCON0=0B10000001;
ADCON1=0B10000000;
TRISD=0X00;
PORTD=0X00;
TMR0=231;
TMR0IE=1;
TMR0IF=0;
GIE=1;
PEIE=1;
Lcd_Init();
Lcd_Clear();

char dizi[20];

while(1)
{
analog_deger1=adc_bilgi(0)*20/1023;
duty_sure= analog_deger1;
__delay_ms(100);
Lcd_Set_Cursor(1,1);
Lcd_Write_String("Masa 7 ");
sprintf(dizi,"motor adimi =%d",duty_sure);
Lcd_Set_Cursor(2,1);
Lcd_Write_String(dizi);
__delay_ms(100);


}


}
En alttaki blokta (ana blok ) aldığınız analog değer kadar step motora puls vereceksiniz , puls ten kastım 4 uç l298 e gönderilecek olan(0100 ,1100,xxxx,xxxx örneğin) bir adım için gereken durumu yazacaksınız, ekranda değer olarak görülen kısım da step motorun adım sayısına göre açısal hesabını bulup yatıracaksınız geriye kalan kısmı aynen kullanabilirsiniz
 

Forum istatistikleri

Konular
128,184
Mesajlar
915,689
Kullanıcılar
449,955
Son üye
seggzsy

Yeni konular

Geri
Üst