欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: STM32F103產生PWM波并計算發送個數源碼 [打印本頁]

作者: 張超01    時間: 2018-8-21 13:37
標題: STM32F103產生PWM波并計算發送個數源碼
#include "stm32f10x.h"               
#include "user_Config.h"              
#include "stm32_eval.h"
#include <stdio.h>


/********************************************************************
********************************************************************/
void start_run(void);
void stop_run(void);




uint8_t  flag =0;
uint8_t  stop_flag =0;    //運轉標志
uint8_t  auto_flag =0;
uint8_t  auto_flag1 =0;
uint32_t count =0;
uint32_t round =0;
uint32_t speed_cal = 750;




延時函數




void Delay(vu32 nCount)
{
        uint32_t a;
        uint32_t b;
  for(a=nCount;a>0;a--)
                for(b=8000;b>0;b--);
}







配置時鐘函數

void RCC_Configuration(void)
{
  /* TIM3 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  /* GPIOA and GPIOB clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
}


pwm波產生管腳設置

void GPIO_pwm_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //復用推挽輸出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);
}

正反轉及調速

void GPIO_key_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOB, &GPIO_InitStructure);
}

步進電機驅動器使能及方向控制

void GPIO_type_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOC, &GPIO_InitStructure);
        GPIO_ResetBits(GPIOC,GPIO_Pin_0);
        GPIO_SetBits(GPIOC,GPIO_Pin_1);
}

定時器設置

void pwm(void)
{
  TIM_TimeBaseStructure.TIM_Period = speed_cal;
  TIM_TimeBaseStructure.TIM_Prescaler = 3-1;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  TIM_ClearFlag(TIM3, TIM_FLAG_Update);                    
  TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = speed_cal/2;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OC1Init(TIM3, &TIM_OCInitStructure);
  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
  TIM_ARRPreloadConfig(TIM3, ENABLE);

  //TIM_Cmd(TIM3, DISABLE);
}

中斷優先級設置

void TIM3_NVIC_Configuration(void)   
{
        NVIC_InitTypeDef NVIC_InitStructure;                        
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);                                                                                                                                   
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;                     
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;        
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                    
                  
  NVIC_Init(&NVIC_InitStructure);
}

中斷函數(統計脈沖個數)

void TIM3_IRQHandler(void)  
{
        if(TIM_GetITStatus(TIM3,TIM_IT_Update!=RESET))
        {
                TIM_ClearITPendingBit(TIM3,TIM_FLAG_Update);
                count++;
                if(count == 768750)
                {
                        count = 0;
                        round++;
                }
                if(round == 5)
                {
                        round = 0;
                        if(flag == 1)
                        {
                                if(auto_flag == 0)
                                {
                                        auto_flag = 1;
                                        stop_run();
                                        Delay(2000);
                                        GPIO_SetBits(GPIOC,GPIO_Pin_0);
                                        start_run();
                                }
                                else
                                {
                                        auto_flag = 0;
                                        stop_run();
                                        Delay(2000);
                                        GPIO_ResetBits(GPIOC,GPIO_Pin_0);
                                        start_run();
                                }
                        }
                }
        }
}

開始發送pwm

void start_run(void)
{
        TIM_Cmd(TIM3, ENABLE);
}

關閉發送pwm

void stop_run(void)
{
        TIM_Cmd(TIM3, DISABLE);
}

正傳

void start_scan1(void)
{
        if(stop_flag == 0)
        {
                if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==0)
                {
                        Delay(200);
                        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==0)
                        {        
                                GPIO_ResetBits(GPIOC,GPIO_Pin_0);
                                start_run();
                                stop_flag = 1;
                                while(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12));
                        }
                }
  }
}

反轉

void start_scan2(void)
{
        if(stop_flag == 0)
        {
                if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==0)
                {
                        Delay(200);
                        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==0)
                        {        
                                GPIO_SetBits(GPIOC,GPIO_Pin_0);
                                start_run();
                                stop_flag =1;
                                while(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13));
                        }
                }
  }
}

停止

void stop_scan(void)
{
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0)
        {
                Delay(200);
                if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0)
                {                                                
                        stop_run();
                        GPIO_ResetBits(GPIOC,GPIO_Pin_0);
                        Delay(1500);
                        stop_flag = 0;
                        while(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15));
                }
        }
}


調速


void change_speed(void)
{
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0)
        {
                Delay(200);
                if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0)
                {
                        if(speed_cal == 750)
                        {
                                speed_cal = 375;
                        }
                        else
                        {
                                speed_cal = 750;
                        }
                        TIM3->ARR = speed_cal;
                        pwm();
                        //TIM_Cmd(TIM3, ENABLE);
                        while(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14));
                }
        }
}

自動旋轉


void auto_run(void)
{
        if(stop_flag == 0)
        {
                if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0)
                {
                        Delay(200);
                        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0)
                        {
                                if(auto_flag1 == 0)
                                        auto_flag1 =1;
                        }
                }
  }
}
/****************************************************************************************************************************************/
int main(void)
{
  RCC_Configuration();
  GPIO_pwm_Configuration();                                                                                                        
  GPIO_key_Configuration();
  GPIO_type_Configuration();
  TIM3_NVIC_Configuration();
  pwm();
  while (1)
  {
                auto_run();
                if(auto_flag1 ==0)
                {
                        start_scan1();
                        start_scan2();
                        stop_scan();
                        change_speed();
                }
                else
                {        
                        if(flag == 0)
                        {
                                flag = 1;
                                GPIO_ResetBits(GPIOC,GPIO_Pin_0);
                                start_run();
                        }
                        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0)
                        {
                                Delay(200);
                                if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0)
                                {                                                
                                        stop_run();
                                        GPIO_ResetBits(GPIOC,GPIO_Pin_0);
                                        auto_flag1 =0;
                                        while(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15));
                                }
                        }
                }
        }
}








歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1