STM LIB PWM Output + Pulse-Period ölçüm

Başlatan Klein, 06 Ekim 2013, 16:14:15

Klein

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){ }
}

blacklogic

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);

Klein

Coocox kullandım. Ancak keil ile derlenmesini engelleyecek bir kod yok. Coocox kütüphanelerini kullanmadım.  Tamamı ST kütüphanesi.
Hatalar neler?

blacklogic

#3
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

Klein

Gerekli kütüphaneleri projeye dahil etmemişsin ve/veya header dosyalarını incude etmemişsin. Hata mesajlarını bu sebepten alıyorsun.

blacklogic

Eklediğim kütüphaneler bunlar. Eksik olan nedir acaba ?


Klein

stm32f10x_gpio
stm32f10x_rcc
stm32f10x_tim


blacklogic

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?


muhittin_kaplan

Hocam kullandığınız işlemci nedir ?

Klein

#10
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.

muhittin_kaplan

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)


Klein

PA6 aynı zamanda analog input.  !!!!   ANALOG GİRİŞLER 5V TOLERANSLI DEĞİL !!!!!

muhittin_kaplan


muhittin_kaplan

capture pini ni değiştirsem (ain olmayan biriyle mesela) ?