Ynt: 6 ayaklı hareket platformu

Başlatan muhittin_kaplan, 20 Ağustos 2013, 15:48:41

muhittin_kaplan




şu an çalışıyor gibi. ama hazırladığım kütüğü ayarlamam gerek.

Ramiz

Muhittin, bu projen ne alemde? 16 adet servoyu, pwm led driver ile kontrol edebildinmi?

(Bu başlığı bulana kadar imanım gevredi yahu :) )
Electrical & Electronics Engineering -> Step one

muhittin_kaplan

favorilere ekle.

LED driver ile çalışıyorum şuan. Bazı Problemler dışında çalışacak gibi görünüyor.
TLC sayısını bir değişkene atadım. değişkeni değiştirerek istediğim kadar Led i kontrol edebiliyorum. Problemleri Çözünce RC servo ile deneyeceğim.


muhittin_kaplan

öylemi demiştim yahu, sivas halayıda zormuş aslında  :-X

Ramiz

Ben bu projenin sonuçlanmasını dört gözle bekliyorum :) şuan elektroniğin çok dışında kalmak zorundayım..  :-\  Yoksa özellikle pcb konusunda yardım etmek isterdim size.

Ve ayrıca bu projenin şu hale geldiğini görmeyi diliyorum. Pc de 6 ayaklı bir örümceğin yürüyüş animasyonu yapılabilir. Bu yürüyüş animasyonu, bilgisayar ortamında farklı şekillerde değiştirilebilir. Mesela animasyon 1 de bacaklar fazla yukarı kaldırılmadan yürüme sağlanır. Animasyon 2 de daha fazla kaldırılır gibi..

Animasyondaki bacak hareketleri, açısal olarak hesaplanabilir ve bir const unsigned değişken çıktısı verilebilir. Örneğin program şöyle bir çıktı versin,
                                                                   Servo1    Servo2     Servo3        Servo4 .........
const unsigned char Servo_Positions[] =  { 0x20,      0x30,       0x12,          0xA2 ...(kaç servo varsa)
.
.
.
.
.
.
.
};


Belli bir timer kesmesi ile bu değerler servolara aktarılırsa tıpkı wav çalar gibi, robot a yürüyüş hareketi sağlanabilir. Bu hareketlerin bilgisayar ortamında yapılıp, robota aktarılması bence daha gerçekçi bir yürüyüş sağlayabilir.

Bu benim ortaya attığım bir fikir. Daha mantıklı çözümler elbet vardır. Üzerine biraz kafa yormak gerekir.
Electrical & Electronics Engineering -> Step one

muhittin_kaplan

#201
#include "stm32f4xx.h"
	#include "stm32f4xx_gpio.h"
	#include "stm32f4xx_rcc.h"
	#include "stm32f4xx_tim.h"
	#include "misc.h"



	#define TLC5940_GPIO	GPIOB
	#define TLC5940_RCC		RCC_AHB1Periph_GPIOB
										//TLC5940
	#define GSCLK_PIN		GPIO_Pin_3  //pin18
	#define DCPRG_PIN		GPIO_Pin_4  //pin19
	#define BLANK_PIN		GPIO_Pin_5  //pin23
	#define XLAT_PIN		GPIO_Pin_6  //pin24
	#define SCLK_PIN		GPIO_Pin_7  //pin25
	#define SIN_PIN			GPIO_Pin_8  //pin26
	#define VPRG_PIN		GPIO_Pin_9  //pin27



	#define TLC5940_N  3 //Chain bağlı TLC5947 sayısı


	u16 PwmValue[16*TLC5940_N];
	u8 ofsetValue[96*TLC5940_N];

	int GSCLK_COUNT;

void Config_GPIO(void){

		GPIO_InitTypeDef  GPIO_InitStructure;
		RCC_AHB1PeriphClockCmd(TLC5940_RCC, ENABLE);

		/* Configure PD12, PD13, PD14 and PD15 in output pushpull mode */
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
		GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
		GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
		GPIO_Init(TLC5940_GPIO, &GPIO_InitStructure);

		GPIO_Init(GPIOD, &GPIO_InitStructure);

}


void _delay(int value){
	while(value--)
	{

	}
}

void Blank_Pulse(){

	GPIO_SetBits(TLC5940_GPIO,BLANK_PIN);
	GPIO_ResetBits(TLC5940_GPIO,BLANK_PIN);
	//TLC5940_GPIO->ODR |=BLANK_PIN;
	//TLC5940_GPIO->ODR &=0x00000000;
}

void Xlat_Pulse(){

	GPIO_SetBits(TLC5940_GPIO,XLAT_PIN);
	GPIO_ResetBits(TLC5940_GPIO,XLAT_PIN);

	//TLC5940_GPIO->ODR |=XLAT_PIN;
	//TLC5940_GPIO->ODR &=0x00000000;

}

void SCLK_Pulse(){
	GPIO_SetBits(TLC5940_GPIO,SCLK_PIN);
	GPIO_ResetBits(TLC5940_GPIO,SCLK_PIN);

	//TLC5940_GPIO->ODR |=SCLK_PIN;
	//TLC5940_GPIO->ODR &=0x00000000;
}


void GSCLK_Pulse(){
	GPIO_SetBits(TLC5940_GPIO,GSCLK_PIN);
	GPIO_ResetBits(TLC5940_GPIO,GSCLK_PIN);
	//TLC5940_GPIO->ODR |=GSCLK_PIN;
	//TLC5940_GPIO->ODR &=0x00000000;

}



//GPIO_ResetBits(TLC5940_GPIO,BLANK_PIN);

/*
		for (;;) {
			GPIO_ResetBits(TLC5940_GPIO,BLANK_PIN);
			for (i = 0; i < 4096; ++i) {
				GSCLK_Pulse();
			}
			GPIO_SetBits(TLC5940_GPIO,BLANK_PIN);

		}
*/
void init_tim7(void){
	TIM_TimeBaseInitTypeDef TIM_TBInitStruct;
	NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1ENR_TIM7EN,ENABLE);
    TIM_TBInitStruct.TIM_Prescaler = 0;
    TIM_TBInitStruct.TIM_Period =400;
    TIM_TimeBaseInit(TIM7,&TIM_TBInitStruct);

    TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE); // Timer Update olayında interrupt istesin.
    NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);


    TIM_Cmd(TIM7, ENABLE);// Timeri başlat

}





void TIM7_IRQHandler(void)
{
TIM7->SR=0;


	if (GSCLK_COUNT==0) {
		Blank_Pulse();
		GSCLK_COUNT++;
	}
	else if (GSCLK_COUNT < 4096) {
		GSCLK_Pulse();
		GSCLK_COUNT++;
	}

	else {
		GSCLK_COUNT=0;
	}

}


void TLC5940_Init(void) {

	GPIO_ResetBits(TLC5940_GPIO, GSCLK_PIN);
	GPIO_ResetBits(TLC5940_GPIO, SCLK_PIN);
	GPIO_ResetBits(TLC5940_GPIO, DCPRG_PIN);
	GPIO_SetBits(TLC5940_GPIO, VPRG_PIN);
	GPIO_ResetBits(TLC5940_GPIO, XLAT_PIN);
	GPIO_SetBits(TLC5940_GPIO, BLANK_PIN);

	int i;

	// PWM değişken içeriğini 0 la
	for (i = 0; i <(16*TLC5940_N); i++) {
		PwmValue[i]=0x0000;
	}


	//DC ofset değerini ata
	for (i = 0; i <(96*TLC5940_N); i++) {
		ofsetValue[i]=0x01;      //00 yada 01 degeri alır. 01 değeri max değerdir.
	}

}


//Burayı kütüphanenin içerisinde bir döngü ile yapmamız gerekecek"
//Bu degerler 0 v üzerindeki DC Ofseti Ayarlıyor.
/*
 *
 *
 *___________   ___________--->3v vcc de 1,3v
 *           | |
 *           |_| _ _ _ _ _ _-->dc data değeri ile bu ofset değeri ayarlanıyor
 *_________________________ -->0volt (gnd)
 *
 *Param_OfsetValue 0x01 or 0x00 degerleri alır.
 *
 *Her IC de 96 adet DC Reg Bulunur. Dizi Hesaplanırken Buna Bağlı Hesaplanmalı.
 *
 * u8 ofsetValue[96*TLC5940_N]; şeklinde.
 */

void TLC5940_ClockInDC(u8 Param_ofsetValue[]) {
	GPIO_SetBits(TLC5940_GPIO, DCPRG_PIN);
	GPIO_SetBits(TLC5940_GPIO, VPRG_PIN);

	int_fast16_t Counter = 0;

	for (;;) {
		if (Counter > (TLC5940_N * 96) - 1) {
			Xlat_Pulse();
			break;
		} else {
			if (Param_ofsetValue[Counter])  //
				GPIO_SetBits(TLC5940_GPIO, SIN_PIN);
			else
				GPIO_ResetBits(TLC5940_GPIO, SIN_PIN);
				SCLK_Pulse();
			Counter++;
		}
	}
}


/*
 *            0x0001 min                         0x0FFF max
 *           /  /                          /      /
 *___________   ___________     ___________       _______
 *           | |                           |     |
 *           |_|                           |_____|
 *_________________________     _________________________

 *
 *Param_PwmValue 0x0000 or 0x0FFF degerleri alır.
 *
 *Her IC de 16 kanal mevcut(her kanalın 12 bit i --16*12--). Dizi Hesaplanırken Buna Bağlı Hesaplanmalı.
 *
 * u16 PwmValue[16*TLC5940_N]; şeklinde.
 */


void TLC5940_SetGS_And_GS_PWM(u16 Param_PwmValue[]) {
	uint8_t firstCycleFlag = 0;

	if (GPIO_ReadOutputDataBit(TLC5940_GPIO, VPRG_PIN)) {
		GPIO_ResetBits(TLC5940_GPIO, VPRG_PIN);
		firstCycleFlag = 1;
	}

	uint16_t GSCLK_Counter = 0;


	GPIO_ResetBits(TLC5940_GPIO, BLANK_PIN);
	for (;;) {
		if (GSCLK_Counter > 4095) {
			GPIO_SetBits(TLC5940_GPIO, BLANK_PIN);
			Xlat_Pulse();

			if (firstCycleFlag) {
				SCLK_Pulse();
				firstCycleFlag = 0;
			}
			break;
		} else {

			char i;
			char z;
			u16 Value=0;
			u16 TempValue=0;

			for (i = 0; i < 16*TLC5940_N; ++i) {  //kanal sayısını hesaplayark döngü kuruyor 1*15

				//TempValue=Param_PwmValue[((16*TLC5940_N)-1)-i]<<4; //sola 4 kaydırıyor.

				for (z = 0; z < 12; ++z) {  //12 bit olduğundan

					Value=(Param_PwmValue[((16*TLC5940_N)-1)-i]<<4)<<z;
					if (Value &=0x8000)
						GPIO_SetBits(TLC5940_GPIO, SIN_PIN);
					else
						GPIO_ResetBits(TLC5940_GPIO, SIN_PIN);
						SCLK_Pulse();

				}
			}
		}
		GSCLK_Pulse();
		GSCLK_Counter++;
	}
}


int main(void)
{
	SystemInit(); //168mhz i?in system_stm32f4xx.c de de?i?iklik yap?ld?.
	Config_GPIO();
	TLC5940_Init();
	TLC5940_ClockInDC(ofsetValue);
	init_tim7();

	int t;


				PwmValue[0]=7*16;//R
				PwmValue[2]=177*16;//G
				PwmValue[1]=15*16;//B

				TLC5940_SetGS_And_GS_PWM(PwmValue);

while(1){

}
return 0;

}


TLC ile yaptığım çalışmanın 50hz olarak ayarlanmış hali, Çıkışına opamp ve eviren yükselteçle bir devre daa eklemem gerekecek.

mesaj birleştirme:: 15 Mart 2014, 14:11:21

Bazı Hatalar mevcut, PWM değerini değiştirdiğimde "Değişiklik Anında" değilde belli bir süre sonra görülüyor.

mesaj birleştirme:: 15 Mart 2014, 14:14:13

@ramiz
18 servo var, bunları bir PWM_valu değerinde tutup , değişimler arasında gecikmeler ile hareketi sağlayacağım. bu gecikmeler hareket hızını belirleyecek. (servonun hızıda bu açıdan önemli.)

Ramiz

Muhittin bence bu ic ile uğraşma..

http://www.alibaba.com/showroom/16--channel-constant-current-led-driver-ic-mbi5030.html

Şuradan iki adet mbi5030 sipariş et. Bu ic nin çalışma mantığı daha basit. Opamp ile filan uğraşma.


Birde Cocoox ile;

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;


bu şekil kod yazılacaksa, cocoox un mikroc vb kütüphane mantığı ile çalışan idelerden farkı ne oluyor?
(Bu soruyu öğrenmek amaçlı soruyorum. Kütü bir mana içermiyor)


--------------------------------------------------------------------------------------------------------------------------------------------------------

Mbi5030 için cocoox ile yazılmış example code: http://www.coocox.org/driver_comp/macroblock-mbi5030-c1510.html?mc=10&sc=69
Electrical & Electronics Engineering -> Step one

muhittin_kaplan

en büyük farkı Bedava.

mesaj birleştirme:: 15 Mart 2014, 15:33:21

ayrıca ST kütüphaneleri kullanıyorsun(kendi kütüphaneleride mevcut açık olarak ben tercih etmiyorum), GCC ile derliyor.

Ramiz

Ok. Bir ara cocoox a bakacağım.

Tavsiyemi iyice bir düşün. Mbi5030, 2 adet 74HC595 gibi çalışır.(16 bit çıkışı vardır) Ayrıca bir adet pwm ucu bulunur. Buraya mcudan pwm sinyali uygularsın, bu kadar. Opamp vs ile pcb ni büyültme.
Electrical & Electronics Engineering -> Step one

muhittin_kaplan

#205
peki 15 kanaldan %40 1 kanaldan %3 pwm alabilirmiyim ?

mesaj birleştirme:: 15 Mart 2014, 21:26:30

Datasını Bulamadım

Ramiz

Soruyu şöyle algılıyorum.

Her bacaktan ayrı ayrı pwm değerleri alabilirmiyim?

Cevap: Evet Çünkü bu ic pwm led driver. 16 adet 16 bitlik (12 bitlik te seçiliyordu sanırım) bilgiyi spi dan veri gönderir gibi ic ye göndereceksiniz.

Sanırım benim gibi internet sorunu yaşamıyorsunuz. Datasheetine bakarsanız, size uygun olup olmadığını daha iyi anlarsınız :)

http://wenku.baidu.com/view/544340cea1c7aa00b52acb38.html
Electrical & Electronics Engineering -> Step one

muhittin_kaplan

Ramiz Bunun TLC ile Farkı Yok,