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){ }
}
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);
Coocox kullandım. Ancak keil ile derlenmesini engelleyecek bir kod yok. Coocox kütüphanelerini kullanmadım. Tamamı ST kütüphanesi.
Hatalar neler?
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
Gerekli kütüphaneleri projeye dahil etmemişsin ve/veya header dosyalarını incude etmemişsin. Hata mesajlarını bu sebepten alıyorsun.
Eklediğim kütüphaneler bunlar. Eksik olan nedir acaba ?
(http://o1310.hizliresim.com/1g/6/tbtb1.jpg)
stm32f10x_gpio
stm32f10x_rcc
stm32f10x_tim
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?
http://www.dosya.tc/server17/iIHQGU/STM32F10x_StdPeriph_Driver.rar.html (http://www.dosya.tc/server17/iIHQGU/STM32F10x_StdPeriph_Driver.rar.html)
Hocam kullandığınız işlemci nedir ?
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.
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)
PA6 aynı zamanda analog input. !!!! ANALOG GİRİŞLER 5V TOLERANSLI DEĞİL !!!!!
:)
capture pini ni değiştirsem (ain olmayan biriyle mesela) ?
Olur. gerilim bölücü de yapabilirsin.
Bu işe önem vermem gerek, şu araç hızı tespiti için kullanacağım.
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ç.
:), 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.
PWM ürettiği pin her konum değiştirdiğinde kesmeye girebiliyor mu?
Kesme seçenekleri içerisinde gördüğümü hatırlıyorum. Detaylara bakmadım.
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);
}