找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1637|回复: 0
打印 上一主题 下一主题
收起左侧

STM32F103C8 PWM源码

[复制链接]
跳转到指定楼层
楼主
ID:403544 发表于 2018-10-20 17:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void RCC1_HSE_Configuration(void) //HSE作为PLL时钟,PLL作为SYSCLK
{
   RCC_DeInit(); /*将外设RCC寄存器重设为缺省值 */
   RCC_HSEConfig(RCC_HSE_ON);          /*设置外部高速晶振(HSE) HSE晶振打开(ON)*/

   if(RCC_WaitForHSEStartUp() == SUCCESS) {  /*等待HSE起振,  SUCCESS:HSE晶振稳定且就绪*/  

   RCC_HCLKConfig(RCC_SYSCLK_Div1);/*设置AHB时钟(HCLK)RCC_SYSCLK_Div1——AHB时钟 = 系统时*/  
   RCC_PCLK2Config(RCC_HCLK_Div1); /*设置高速AHB时钟(PCLK2)RCC_HCLK_Div1——APB2时钟 = HCLK*/     
   RCC_PCLK1Config(RCC_HCLK_Div2); /*设置低速AHB时钟(PCLK1)RCC_HCLK_Div2——APB1时钟 = HCLK / 2*/      

   RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/*设置PLL时钟源及倍频系数*/   
   RCC_PLLCmd(ENABLE);          /*使能PLL */
   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ; /*检查指定的RCC标志位(PLL准备好标志)设置与否*/

   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  /*设置系统时钟(SYSCLK) */  
   while(RCC_GetSYSCLKSource() != 0x08);     /*0x08:PLL作为系统时钟 */            
}
}
void TurnLeft1()
{  

         IN1_H IN2_L
         IN3_H IN4_L
         XX=500;
         YY=800;       
         TimCounterInit1(XX,YY);

}
void TurnRight1(void)
{
         IN1_H IN2_L
         IN3_H IN4_L
         XX=800;
         YY=500;       
        TimCounterInit1(XX,YY);

}
void straight1(void)
{
         IN1_H IN2_L
         IN3_H IN4_L
         XX=600;
         YY=600;
  TimCounterInit1(XX,YY);
}

void sternway1(void)
{
        IN1_L        IN2_H       
        IN3_L IN4_H       
        XX=700;
        YY=700;       
        TimCounterInit1(XX,YY);
}

void Gpio_PWM_Init1(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
  //以下设定是将TIM1的通道1(PA0)的复用功能打开,这很重要很容易被忘掉
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

        GPIO_InitStructure.GPIO_Pin        = GPIO_PWM_8;              //选择PA0 PA8|GPIO_PWM_B
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;          //管脚频率为50MHZ
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         //模式为复用推挽输出
  GPIO_Init(GPIO_A, &GPIO_InitStructure);           //初始化寄存器
}

void Gpio_M_Init1(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

        GPIO_InitStructure.GPIO_Pin        = GPIO_Pin_IN1|GPIO_Pin_IN2|GPIO_Pin_IN3|GPIO_Pin_IN4;              //选择1256
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;          //管脚频率为50MHZ
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         
  GPIO_Init(GPIO_IN, &GPIO_InitStructure);           //初始化寄存器GPIOB  1 2 5 6
}

/********************************************************************************************
*函数名称:void TimCounterInit(void)
*功能说明:TIM计数初始化配置
*               TIMCLK = 72 MHz, Prescaler = TIM_PSC, TIM counter clock = TIMCLK/TIM_COUNTER MHz
*******************************************************************************************/
void TimCounterInit1(int rate_1,int rate_2)        //rate可以改变占空比
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
       
        /* TIM时钟使能 */
        RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

        /* 基定时器初始化 */
        TIM_TimeBaseStructure.TIM_Period = 1000000*0.001;        //计数值 1000;须介于0~65535
        TIM_TimeBaseStructure.TIM_Prescaler = 72;          //分频系数,为了设定值数值较大,这里选得较小                 
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;                //时钟分割:计数模式中无作用
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        //计数模式,向上计数
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;        //重复计数值

        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);                //初始化TIM
       
        /* PWM1 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//输出模式设定
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出模式使能
  TIM_OCInitStructure.TIM_Pulse = rate_1; //设置占空比,0时全低电平,1001时全高电平.须介于0~65535
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出比较极性;最终输出值是高/低电平

        TIM_OC1Init(TIM1, &TIM_OCInitStructure);//输出通道x,参数写入
        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);//使能通道x预装载寄存器       
       
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//输出模式设定
        TIM_OCInitStructure.TIM_Pulse = rate_2; //设置占空比,0时全低电平,1001时全高电平.须介于0~65535
        TIM_OC2Init(TIM1, &TIM_OCInitStructure);//输出通道x,参数写入
        TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);//使能通道x预装载寄存器
        TIM_Cmd(TIM1, ENABLE);                                                //使能TIM
}


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表