Picproje Elektronik Sitesi

PICPROJE PROGRAMLAMA DERSLERİ => STM32 Örnekleri => Konuyu başlatan: Klein - 06 Ekim 2013, 16:14:15

Başlık: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: Klein - 06 Ekim 2013, 16:14:15
STM32F10x için PWM Out ve Periyot ölçüm örneği.

#include "stm32f10x.h"

int period;
int duty;

void init_clock(void)
{
RCC_HSICmd(ENABLE);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PLLConfig(RCC_CFGR_PLLSRC_HSI_Div2,RCC_CFGR_PLLMULL12);
RCC_PLLCmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while (RCC_GetSYSCLKSource() != 0x08);
SystemCoreClockUpdate();

}

void init_gpio(void){
GPIO_InitTypeDef  GPIO_InitStructure;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; // PWM Output  TIM4 CH1
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;  // PWM Input TIM3 CH1
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void init_rcc(void){
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 | RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
}

void init_pwm(void){
TIM_TimeBaseInitTypeDef TIM_TBInitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;

     TIM_TBInitStruct.TIM_Period = 4999; // taşma değeri.
     TIM_TBInitStruct.TIM_Prescaler =47;
TIM_TBInitStruct.TIM_ClockDivision = 0;
TIM_TBInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TBInitStruct);

TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStruct.TIM_Pulse = 1250;
TIM_OC1Init(TIM4, &TIM_OCInitStruct);
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_Cmd(TIM4,ENABLE);
}

void init_ic(void){
NVIC_InitTypeDef NVIC_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TBInitStruct;
TIM_ICInitTypeDef TIM_ICInitStruct;
TIM_TBInitStruct.TIM_Period = 4999;
TIM_TBInitStruct.TIM_Prescaler =47;
TIM_TBInitStruct.TIM_ClockDivision = 0;
TIM_TBInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TBInitStruct);

TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;
TIM_ICInitStruct.TIM_ICFilter = 0x00;
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;

TIM_PWMIConfig(TIM3,&TIM_ICInitStruct);
TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
TIM_ITConfig(TIM3,TIM_IT_CC1,ENABLE);

NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
TIM_Cmd(TIM3,ENABLE);
}

void TIM3_IRQHandler(void){
period= TIM_GetCapture1(TIM3); // period
duty= TIM_GetCapture2(TIM3); // duty
TIM_ClearITPendingBit(TIM3,TIM_IT_CC1);
}

int main(void)
{
    init_rcc();
    init_clock();
    init_gpio();
    init_pwm();
    init_ic();
   while (1){ }
}

Başlık: Ynt: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: blacklogic - 06 Ekim 2013, 19:29:00
Hangi derleyici bu acaba? Keil mdk-arm 4.70 kullanıyorum şu kısımlar hata veriyor


void init_clock(void)
{
    RCC_HSICmd(ENABLE);
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    RCC_PCLK1Config(RCC_HCLK_Div1);
    RCC_PCLK2Config(RCC_HCLK_Div1);
    RCC_PLLConfig(RCC_CFGR_PLLSRC_HSI_Div2,RCC_CFGR_PLLMULL12);
    RCC_PLLCmd(ENABLE);
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    while (RCC_GetSYSCLKSource() != 0x08);
    SystemCoreClockUpdate();

}

void init_gpio(void){
GPIO_InitTypeDef  GPIO_InitStructure;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; // PWM Output  TIM4 CH1
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;  // PWM Input TIM3 CH1
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void init_rcc(void){
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 | RCC_APB1Periph_TIM3,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
Başlık: Ynt: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: Klein - 06 Ekim 2013, 19:49:44
Coocox kullandım. Ancak keil ile derlenmesini engelleyecek bir kod yok. Coocox kütüphanelerini kullanmadım.  Tamamı ST kütüphanesi.
Hatalar neler?
Başlık: Ynt: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: blacklogic - 06 Ekim 2013, 19:51:47
Hata mesajı.

A registeri için, a->x=0x123143  şeklinde olmadıkça anlamıyorum ne olduğunu.



Build target 'Target 1'
compiling main.c...
main.c(8): warning:  #223-D: function "RCC_HSICmd" declared implicitly
main.c(9): warning:  #223-D: function "RCC_HCLKConfig" declared implicitly
main.c(9): error:  #20: identifier "RCC_SYSCLK_Div1" is undefined
main.c(10): warning:  #223-D: function "RCC_PCLK1Config" declared implicitly
main.c(10): error:  #20: identifier "RCC_HCLK_Div1" is undefined
main.c(11): warning:  #223-D: function "RCC_PCLK2Config" declared implicitly
main.c(12): warning:  #223-D: function "RCC_PLLConfig" declared implicitly
main.c(13): warning:  #223-D: function "RCC_PLLCmd" declared implicitly
main.c(14): warning:  #223-D: function "RCC_GetFlagStatus" declared implicitly
main.c(14): error:  #20: identifier "RCC_FLAG_PLLRDY" is undefined
main.c(15): warning:  #223-D: function "RCC_SYSCLKConfig" declared implicitly
main.c(15): error:  #20: identifier "RCC_SYSCLKSource_PLLCLK" is undefined
main.c(16): warning:  #223-D: function "RCC_GetSYSCLKSource" declared implicitly
main.c(22): error:  #20: identifier "GPIO_InitTypeDef" is undefined
main.c(24): error:  #20: identifier "GPIO_Mode_AF_PP" is undefined
main.c(25): error:  #20: identifier "GPIO_Speed_50MHz" is undefined
main.c(27): error:  #20: identifier "GPIO_Pin_6" is undefined
main.c(28): warning:  #223-D: function "GPIO_Init" declared implicitly
main.c(35): warning:  #223-D: function "RCC_APB1PeriphClockCmd" declared implicitly
main.c(35): error:  #20: identifier "RCC_APB1Periph_TIM4" is undefined
main.c(35): error:  #20: identifier "RCC_APB1Periph_TIM3" is undefined
main.c(36): warning:  #223-D: function "RCC_APB2PeriphClockCmd" declared implicitly
main.c(36): error:  #20: identifier "RCC_APB2Periph_GPIOA" is undefined
main.c(36): error:  #20: identifier "RCC_APB2Periph_GPIOB" is undefined
main.c(36): error:  #20: identifier "RCC_APB2Periph_AFIO" is undefined
main.c(40): error:  #20: identifier "TIM_TimeBaseInitTypeDef" is undefined
main.c(41): error:  #20: identifier "TIM_OCInitTypeDef" is undefined
main.c(46): error:  #20: identifier "TIM_CounterMode_Up" is undefined
main.c(47): warning:  #223-D: function "TIM_TimeBaseInit" declared implicitly
main.c(49): error:  #20: identifier "TIM_OCMode_PWM1" is undefined
main.c(50): error:  #20: identifier "TIM_OCPolarity_High" is undefined
main.c(51): error:  #20: identifier "TIM_OutputState_Enable" is undefined
main.c(52): error:  #20: identifier "TIM_OCIdleState_Set" is undefined
main.c(54): warning:  #223-D: function "TIM_OC1Init" declared implicitly
main.c(55): warning:  #223-D: function "TIM_OC1PreloadConfig" declared implicitly
main.c(55): error:  #20: identifier "TIM_OCPreload_Enable" is undefined
main.c(56): warning:  #223-D: function "TIM_Cmd" declared implicitly
main.c(60): error:  #20: identifier "NVIC_InitTypeDef" is undefined
main.c(61): error:  #20: identifier "TIM_TimeBaseInitTypeDef" is undefined
main.c(62): error:  #20: identifier "TIM_ICInitTypeDef" is undefined
main.c(66): error:  #20: identifier "TIM_CounterMode_Up" is undefined
main.c(67): warning:  #223-D: function "TIM_TimeBaseInit" declared implicitly
main.c(69): error:  #20: identifier "TIM_Channel_1" is undefined
main.c(71): error:  #20: identifier "TIM_ICPolarity_Rising" is undefined
main.c(72): error:  #20: identifier "TIM_ICPSC_DIV1" is undefined
main.c(73): error:  #20: identifier "TIM_ICSelection_DirectTI" is undefined
main.c(75): warning:  #223-D: function "TIM_PWMIConfig" declared implicitly
main.c(76): warning:  #223-D: function "TIM_SelectInputTrigger" declared implicitly
main.c(76): error:  #20: identifier "TIM_TS_TI1FP1" is undefined
Target not created

Başlık: Ynt: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: Klein - 06 Ekim 2013, 20:00:10
Gerekli kütüphaneleri projeye dahil etmemişsin ve/veya header dosyalarını incude etmemişsin. Hata mesajlarını bu sebepten alıyorsun.
Başlık: Ynt: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: blacklogic - 06 Ekim 2013, 20:09:29
Eklediğim kütüphaneler bunlar. Eksik olan nedir acaba ?

(http://o1310.hizliresim.com/1g/6/tbtb1.jpg)
Başlık: Ynt: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: Klein - 06 Ekim 2013, 21:14:47
stm32f10x_gpio
stm32f10x_rcc
stm32f10x_tim

Başlık: Ynt: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: blacklogic - 06 Ekim 2013, 21:31:59
Alıntı yapılan: Klein - 06 Ekim 2013, 21:14:47
stm32f10x_gpio
stm32f10x_rcc
stm32f10x_tim

stm32f10x_tim bu kütüphaneyi bulamadım, diğerleri var. Acaba sizdeki kütüphaneyi buraya koyabilir misiniz?
Başlık: Ynt: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: Klein - 06 Ekim 2013, 22:01:22
http://www.dosya.tc/server17/iIHQGU/STM32F10x_StdPeriph_Driver.rar.html (http://www.dosya.tc/server17/iIHQGU/STM32F10x_StdPeriph_Driver.rar.html)
Başlık: Ynt: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: muhittin_kaplan - 07 Ekim 2013, 19:04:36
Hocam kullandığınız işlemci nedir ?
Başlık: Ynt: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: Klein - 07 Ekim 2013, 19:31:30
STM32F103C8

mesaj birleştirme:: 07 Ekim 2013, 19:35:17

void init_pwm(void){
TIM_TimeBaseInitTypeDef TIM_TBInitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;

     TIM_TBInitStruct.TIM_Period = 50000; // taşma değeri.
     TIM_TBInitStruct.TIM_Prescaler =47;

Kodun burası hatalı. Periyot değeri 4999 olacak.  Yanlışlıkla değiştirmişim. Şimdi düzeltemiyorum.
Başlık: Ynt: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: muhittin_kaplan - 07 Ekim 2013, 20:32:56
ben 100rb ile çalıştırdım 24mhz de 10hz oldu.
sonrasında değerleri değiştirdim.

esas problemim şu oldu, HC-SR04 5v çalışıyor. neden bilmiyorum CapIN girişine bağladığımda çöküyör sinyal (PA6)

Başlık: Ynt: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: Klein - 07 Ekim 2013, 20:36:27
PA6 aynı zamanda analog input.  !!!!   ANALOG GİRİŞLER 5V TOLERANSLI DEĞİL !!!!!
Başlık: Ynt: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: muhittin_kaplan - 07 Ekim 2013, 21:24:30
:)
Başlık: Ynt: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: muhittin_kaplan - 12 Ekim 2013, 18:00:32
capture pini ni değiştirsem (ain olmayan biriyle mesela) ?
Başlık: Ynt: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: Klein - 12 Ekim 2013, 18:09:48
Olur. gerilim bölücü de yapabilirsin.
Başlık: Ynt: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: muhittin_kaplan - 12 Ekim 2013, 18:11:29
Bu işe önem vermem gerek, şu araç hızı tespiti için kullanacağım.
Başlık: Ynt: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: Klein - 12 Ekim 2013, 18:17:21
Gerilim bölücü önemsiz bir devre değil ki! Hatta bu güne kadar tanıdığım en önemli devre. :)

Opampların geri beslemesi bir gerilim bölücü. Regülatörlerin geri beslemesi gerilim bölücü. belki daha sayamadığım bir sürü önemli devre gerilim bölücü ile yapılıyor.
Yeterki hat empedansına, giriş akımına vs..  uygun değerler seç.
Başlık: Ynt: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: muhittin_kaplan - 12 Ekim 2013, 18:25:40
:), yok hocam gerilim bölcüden bahsetmiyorum. bunu PWM ınputu kullanarak HC-SR4 ulrasounic sensörü kullanacağım. ve Arac Hız tespitinde yararlanacağım.
Başlık: Ynt: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: SpeedyX - 09 Kasım 2013, 21:13:00
PWM ürettiği pin her konum değiştirdiğinde kesmeye girebiliyor mu?
Başlık: Ynt: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: Klein - 11 Kasım 2013, 14:08:41
Kesme seçenekleri içerisinde gördüğümü hatırlıyorum. Detaylara bakmadım.
Başlık: Ynt: STM LIB PWM Output + Pulse-Period ölçüm
Gönderen: SpeedyX - 20 Kasım 2013, 09:09:39
Custom PWM:

PWM1DutyCycleTime değerini 0 - Period aralığında değiştirerek duty ile oynanabiliyor.

uint16_t PWM1DutyCycleTime;

void PWMOutSetup(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  TIM_OCInitTypeDef TIM_OCInitStructure;
 
  /* Time base configuration */
  /*
  Period calculation:
  72MHz / 72 = 1MHz or 1µs period unit.
  1µs + 9999 x (1µs) = 10ms
  */
  TIM_TimeBaseStructure.TIM_Period = 9999;
  TIM_TimeBaseStructure.TIM_Prescaler = 72;
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
 
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive; // output lines are disabled
 
  /* Output Compare Active Mode configuration: Channel1 */ 
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = PWM1DutyCycleTime;
  //TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OC1Init(TIM2, &TIM_OCInitStructure);
  TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable); // The preload must be disabled to able to change the compare value at run time
 
  /* Enable the TIM2 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
 
  /* TIM IT enable */
  TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_Update, ENABLE);
 
  /* TIM2 enable counter */
  TIM_Cmd(TIM2, ENABLE);
}

void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
// PWM pin = 0
}
else if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
// PWM pin = 1
}
TIM_SetCompare1(TIM2, PWM1DutyCycleTime);
}