اطلاعیه

Collapse
No announcement yet.

سوال در مورد کار با تایمر

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    سوال در مورد کار با تایمر

    باسلام
    دوستان یک سوالی داشتم اینکه من می خوام یکی ازتایمر هایم رو فعال کنم و با مقدار دهی مثلا هر 10 میلی ثانیه یک اینتراپت بگیرم ازش حالا سوالم اینجاست واقعا گیج شدم که انقدر تایم دیدم الان مثلا timeperiod && time_prescaler&& time_division و اینکه الان من از کریستال 8 مگ خارجی استفاده می کنم الان این کریستال 8 مگ مستقیم میره به کلاک تایمر یا نه سرعت سی پی یو میره که تا 72 مگ هم میشه و اینکه اگه میشه یه کد ساده بگید فقط برای همین که مثلا هر 20 میلی ثانیه یک اینتراپت بده با تایمر و توضیحم بدهید ممنون میشم .
    با تشکر :

    #2
    پاسخ : سوال در مورد کار با تایمر

    کلاک تایمر حداکثر میتونه با کلاک سیستم که 72 مگ هست تغذیه شه یا اینکه با استفاده از PLL تقسیمی از کلاک اصلی باشه.
    مثلا نمونه کد زیر برای ایجاد موج PWM با فرکانس 1 مگاهرتز روی کانال 1 تایمر 4 هست.
    ابتدا که تنظیمات GPIO -- اتصال کلاک به GPIO و TIMER4 ---- اینیشال تایمر ---- اینیشیال PWM ---- و در اخر روشن کردن خروجی PWM

    اگر اشتباه حساب نکرده باشم برای کلاک 72 مگ و خروجی PWM با فرکانس 20 کیلوهرتز و دیوتی 50% این مقادیر رو باید جایگذاری کنین:
    Prescaler= 100 ----- Period=36 --- ClockDivision=1 ---- Pulse=18

    کد:
     // Enable GPIOA and GPIOB clock  
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  
    	
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;  
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
     GPIO_Init(GPIOB, &GPIO_InitStructure); 
      
    	 
     // Enable TIM4 clock  
     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);  
      
     // TIM4 Peripheral Configuration  
     TIM_DeInit( TIM4);  
    
     // Time Base configuration  
     TIM_InitStructure.TIM_Prescaler = 8;  
     TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;  
     TIM_InitStructure.TIM_Period = 7; // 10 bit  
     TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;  
     TIM_InitStructure.TIM_RepetitionCounter = 0x0;  
     TIM_TimeBaseInit(TIM4, &TIM_InitStructure);  
      
     // Channel 1 Configuration in PWM mode  
     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  
     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
     TIM_OCInitStructure.TIM_Pulse = 4;  
    
     TIM_OC1Init(TIM4, &TIM_OCInitStructure);
    
     // TIM4 counter enable  
     TIM_Cmd(TIM4, ENABLE);
      
     // Main Output Enable  
     TIM_CtrlPWMOutputs(TIM4, ENABLE);

    دیدگاه


      #3
      پاسخ : سوال در مورد کار با تایمر

      نوشته اصلی توسط mohammad poorkhalili
      کلاک تایمر حداکثر میتونه با کلاک سیستم که 72 مگ هست تغذیه شه یا اینکه با استفاده از PLL تقسیمی از کلاک اصلی باشه.
      مثلا نمونه کد زیر برای ایجاد موج PWM با فرکانس 1 مگاهرتز روی کانال 1 تایمر 4 هست.
      ابتدا که تنظیمات GPIO -- اتصال کلاک به GPIO و TIMER4 ---- اینیشال تایمر ---- اینیشیال PWM ---- و در اخر روشن کردن خروجی PWM

      اگر اشتباه حساب نکرده باشم برای کلاک 72 مگ و خروجی PWM با فرکانس 20 کیلوهرتز و دیوتی 50% این مقادیر رو باید جایگذاری کنین:
      Prescaler= 100 ----- Period=36 --- ClockDivision=1 ---- Pulse=18

      کد:
       // Enable GPIOA and GPIOB clock  
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  
      	
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;  
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
       GPIO_Init(GPIOB, &GPIO_InitStructure); 
        
      	 
       // Enable TIM4 clock  
       RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);  
        
       // TIM4 Peripheral Configuration  
       TIM_DeInit( TIM4);  
      
       // Time Base configuration  
       TIM_InitStructure.TIM_Prescaler = 8;  
       TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;  
       TIM_InitStructure.TIM_Period = 7; // 10 bit  
       TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;  
       TIM_InitStructure.TIM_RepetitionCounter = 0x0;  
       TIM_TimeBaseInit(TIM4, &TIM_InitStructure);  
        
       // Channel 1 Configuration in PWM mode  
       TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  
       TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
       TIM_OCInitStructure.TIM_Pulse = 4;  
      
       TIM_OC1Init(TIM4, &TIM_OCInitStructure);
      
       // TIM4 counter enable  
       TIM_Cmd(TIM4, ENABLE);
        
       // Main Output Enable  
       TIM_CtrlPWMOutputs(TIM4, ENABLE);
      ممنون از توضیحاتتون
      من می خوام یک کار ساده انجام بدهم تایمرم رو مقدار دهی کنم و هر بار که تایمر سر ریز میشه بره قسمت اینتراپت و من اونجا یک بیت رو یک کنم فقط همین
      چند تا نکته هم که متوجه نمی شم دقیق این ها هستند الان من وقتی کریستال 8 مگ وصل کردم کلاکی که میره رویه تایمر من چه مقدار هست من این تنظیمات زیر رو انجام دادم ولی کار نمی کنه کد رو براتون میزارم میشه ببینید کجا اشتباهه یا چیزی رو کم گذاشتم
      کد:
      [left]#include<RTL.h>
      #include<stm32f10x.h>
      
      int test_timer,counter;
      
      
      
      
      
      
      
      void rcc_init(void)
      {
      	 RCC_HSEConfig( RCC_HSE_ON);//HSE ENAVLE
      	RCC_WaitForHSEStartUp();
      
      	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
      
       RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	/* TIM2 clock enable */
      
      	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);
      	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);
      	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC ,ENABLE);
      	
      }
      /***************************************************************/
      void GPIO_Init1 (void) {
      
      GPIO_InitTypeDef GPIO_InitStructure;
       
      	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 ;//blink led
      	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
      	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      	GPIO_Init(GPIOB, &GPIO_InitStructure);
      
      
      }
      /****************************************************************/
      void NVIC_Configuration(void)
      {
       NVIC_InitTypeDef NVIC_InitStructure;
      
       /* Enable the TIM2 global Interrupt */
       NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      
       NVIC_Init(&NVIC_InitStructure);
      }
      /****************************************************************/
      
      
      void init_timer2(void)
      {
      	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
      	/* Time base configuration */
      	TIM_DeInit(TIM2);
       TIM_TimeBaseStructure.TIM_Period = 1000;
       TIM_TimeBaseStructure.TIM_Prescaler = (36000 - 1);
       TIM_TimeBaseStructure.TIM_ClockDivision = 0;
       TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
      
       TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
      	TIM_ClearFlag(TIM2, TIM_FLAG_Update);					  
       TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
       TIM_Cmd(TIM2, ENABLE);		
      	
      }
      /****************************************************************/
      
      void TIMER2_IRQHandler(void) // tabe vaghfe daryaft Timer2
      {
      test_timer=1;
      		
      }
      
      /****************************************************************/
      
      int main(void)
      {
      	rcc_init();
       GPIO_Init1 ();
      	NVIC_Configuration();
      	init_timer2();
      	GPIO_SetBits( GPIOB, GPIO_Pin_8 );
      	while(1)
      	{
      		if(test_timer)
      		{
      			test_timer=0;
      			counter++;
      			
      			
      		}
      		
      		
      		
      		if(counter>=2)
      			GPIO_SetBits( GPIOB, GPIO_Pin_8 );
      		
      		if(counter>=4)
      		{
      			GPIO_SetBits( GPIOB, GPIO_Pin_8 );
      			counter=0;
      		}
      	}
      	
      }
      [/left]
      در اینجا چون APB1 i هست من فرض کردم که کلاک میشه 36مگآیا این فرض درسته
      با تشکر

      دیدگاه

      لطفا صبر کنید...
      X