TIM8 PWM sorunu

Başlatan EMP_Otto, 19 Temmuz 2013, 16:35:37

EMP_Otto

Merhaba arkadaslar STM32f4 ile TIM8 kullanarak pwm üretmeye çalıstım ama bir türlü beceremedim  :)
Aslında aynı mantıkla TIM3 te calıstırdım ama....
Kodlar derleniyor fakat pinlerde herhangi bir atraksiyon yok:)
#include "stm32f4xx.h"
#include "misc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"

void Init()
{
	    RCC->CFGR |= 0x00009400;         // AHB ve APB hizlarini max degerlere set edelim
	    RCC->CR |= 0x00010000;            // HSE Xtal osc calismaya baslasin
	    while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
	    RCC->PLLCFGR = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
	//  RCC->PLLCFGR = 0x07402A04;     // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
	    RCC->CR |= 0x01000000;            // PLL calismaya baslasin  (Rehber Sayfa 95)
	    while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
	//  FLASH->ACR = 0x00000705;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
	    FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
	    RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
	    while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
	    RCC->AHB1ENR |= 0x0000000F;    // GPIO A,B,C,D clock'u aktif edelim
	    GPIOD->MODER = 0x55000000;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)
	    GPIOD->OSPEEDR= 0xFFFFFFFF;   // GPIOD nin tum cikislari en yuksek hizda kullanacagiz


}
void TIM8_Init(void)
{         GPIOC->MODER=0x000AA000;//GPIOC 6,7,8,9 alternatif fonk yap1ldi
	      RCC->APB2ENR|=0x00000002;//TIM8 CLOCK AKTIF
		  TIM8->CR1|=0X0080; //AUTO RELOAD AKTIF
		  TIM8->PSC=3;   //TIM8 42 MHZ HIZLA CALISIYOR
		  TIM8->ARR=1399; //TIM8 30 kHZ DE CALISACAK
		  TIM8->CCR1=980; //CH1 %70 DOLULUK
		  TIM8->CCR2=700; //CH2 %50 DOLULUK
	      TIM8->CCR3=280; //CH3 %20 DOLULUK
		  TIM8->CCR4=140; //CH4 %10 DOLULUK
		  TIM8->CCMR1|=0x6060;
		  TIM8->CCMR2|=0x6060;//Gerekli ayarlar yapıldı
		  TIM8->CCER|=0x1111; //Tüm kanallar aktıf edildi


		  GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_TIM8);//TIM8 kanalları ayarlandı
		  GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_TIM8);
		  GPIO_PinAFConfig(GPIOC,GPIO_PinSource8,GPIO_AF_TIM8);
		  GPIO_PinAFConfig(GPIOC,GPIO_PinSource9,GPIO_AF_TIM8);
		  TIM8->CR1|=0X0001;//TIM8 counter enable edildi
}

int main()
{   Init();
	TIM8_Init();
       while(1)
         {
            //Sonsuz Döngü
         }
}



nerde yanlıs yapıyorum acaba
Bu işler zordur,özveri ister...

NaMcHo

#1
BDTR registerını ayarlamanız gerekiyor PWM çıkışları aktif değil şuanda sizin kodlarda(BDTR 15.bitinin 1 olması gerekiyor PWM görebilmeniz için).

Örnek:
TIM8->BDTR=0x00;
	//TIM8->BDTR|=(1<<15);					//Ana çikis aktif.
	//AOE=0 break olustugunda elle aktif edilecek cikislar.
	TIM8->BDTR|=(1<<11 | 1<<10);	//OSSR ve OSSRI aktif.
	//DeadTime süresini
	TIM8->BDTR|=(1<<7 | 1<<6 | 1<<5);	//[7:5]=111 olucak asagidaki formul için.
	TIM8->BDTR|=21;								//DeadTime registerina 5usn icin 20.5 yazilmali
	TIM8->BDTR|=(1<<15);



EMP_Otto

Çok sağolun hocam dediğiniz gibi  BDTR nin 15. bitin set ettim ancak 14. bitide set etmek gerekiyor(automatic output enable).
Programın tam calısan halini buraya koyuyorum,arkadaslara yardımcı olur insallah
#include "stm32f4xx.h"
#include "misc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"

void Init()
{
	    RCC->CFGR |= 0x00009400;         // AHB ve APB hizlarini max degerlere set edelim
	    RCC->CR |= 0x00010000;            // HSE Xtal osc calismaya baslasin
	    while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
	    RCC->PLLCFGR = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
	//  RCC->PLLCFGR = 0x07402A04;     // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
	    RCC->CR |= 0x01000000;            // PLL calismaya baslasin  (Rehber Sayfa 95)
	    while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
	//  FLASH->ACR = 0x00000705;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
	    FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
	    RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
	    while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
	    RCC->AHB1ENR |= 0x0000000F;    // GPIO A,B,C,D clock'u aktif edelim
	    GPIOD->MODER = 0x55000000;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)
	    GPIOD->OSPEEDR= 0xFFFFFFFF;   // GPIOD nin tum cikislari en yuksek hizda kullanacagiz


}
void TIM8_Init(void)
{         GPIOC->MODER=0x000AA000;//GPIOC 6,7,8,9 alternatif fonk yap1ldi
	      RCC->APB2ENR|=0x00000002;//TIM8 CLOCK AKTIF
		  TIM8->CR1|=0X0080; //AUTO RELOAD AKTIF
		  TIM8->PSC=3;   //TIM8 42 MHZ HIZLA CALISIYOR
		  TIM8->ARR=1399; //TIM8 30 kHZ DE CALISACAK
		  TIM8->CCR1=980; //CH1 %70 DOLULUK
		  TIM8->CCR2=700; //CH2 %50 DOLULUK
	      TIM8->CCR3=280; //CH3 %20 DOLULUK
		  TIM8->CCR4=140; //CH4 %10 DOLULUK
		  TIM8->CCMR1|=0x6060;
		  TIM8->CCMR2|=0x6060;//Gerekli ayarlar yapıldı
		  TIM8->CCER|=0x1111; //Tüm kanallar aktıf edildi
          TIM8->BDTR|=0xC000; //Main output Enable edildi,Auto output enable aktif edildi

		  GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_TIM8);//TIM8 kanalları ayarlandı
		  GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_TIM8);
		  GPIO_PinAFConfig(GPIOC,GPIO_PinSource8,GPIO_AF_TIM8);
		  GPIO_PinAFConfig(GPIOC,GPIO_PinSource9,GPIO_AF_TIM8);
		  TIM8->CR1|=0X0001;//TIM8 counter enable edildi
}

int main()
{   Init();
	TIM8_Init();
       while(1)
         {
            //Sonsuz Döngü
         }
}

[code]

Bu arada derleyici olarak Coide kullandım.Keilde de sorun cıkaracagını düşünmüyorum.
Bu işler zordur,özveri ister...

NaMcHo

Alıntı yapılan: EMP_Otto - 19 Temmuz 2013, 17:46:26
Çok sağolun hocam dediğiniz gibi  BDTR nin 15. bitin set ettim ancak 14. bitide set etmek gerekiyor(automatic output enable).
Programın tam calısan halini buraya koyuyorum,arkadaslara yardımcı olur insallah

14.Biti set etmek zorunda değilsiniz.
14.Bitin görevi şu: Break event'i oluştuğunda PWM çıkışlarınız inaktif değerlerine dönerler(15.bit 0'a çekilir.) ve eğer siz 14.biti set ettiyseniz break event'i ortadan kalktığında 15.bit donanım tarafından set edilir.