946|1

4

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

STM32F103C8 控制PWM 软件代码 [复制链接]

//#include "pwm.h"

#ifndef  __PWM_H
#define  __PWM_H
#include "sys.h"
void TIM1_2PWM_Init(u16 t1pwm_f,u16 t1psc);
void TIM4_PWM_Init(u16 arr,u16 psc);
#endif


//        TIM3_PWM_Init(pwm_f,0); //设置频率为50Hz,公式为:溢出时间Tout(单位秒)=(arr+1)(psc+1)/Tclk     
//20MS = (59999+1)*(23+1)/72000000
                         //Tclk为通用定时器的时钟,如果APB1没有分频,则就为系统时钟,72MHZ
                         //PWM时钟频率=72000000/(59999+1)*(23+1) = 50HZ (20ms),设置自动装载值60000,预分频系数24
                         //TIM_SetCompare3(TIM3,550);改变比较值TIM3->CCR2达到调节占空比的效果
                                            
 // TIM_SetCompare3(TIM3,171); 

//#include "pwm.c"

#include "pwm.h"
#include "encoder.h"

void TIM1_2PWM_Init(u16 t1pwm_f,u16 t1psc)//boost电路输出互补PWM波形(PA8、PB13)
{      
    GPIO_InitTypeDef GPIO_InitStructure;   //GPIO初始化
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;//定时器初始化
    TIM_BDTRInitTypeDef TIM_BDTRInitStruct;
    TIM_OCInitTypeDef TIM_OCInitStruct;//定时器通道初始化
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); //使能PORTA,B时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
    
    //初始化GPIO,PA8
    
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//端口复用
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure); //PA8
    
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_15;
    GPIO_Init(GPIOB,&GPIO_InitStructure);//PB13
        
    //初始化时具单元
    TIM_DeInit(TIM1);
    TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);//用其默认值填充每个TIM_TimeBaseInitStruct成员
    TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//分频因子
    //TIM_TimeBaseInitStruct.TIM_ClockDivision=0;
    TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
    TIM_TimeBaseInitStruct.TIM_Period=t1pwm_f;    //设置自动重装载值
  TIM_TimeBaseInitStruct.TIM_Prescaler=t1psc;        //预分频系数
    TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);//完成定时器初始化
    
    //将输出通道2初始化为PWM模式1
    
    TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
    TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
    TIM_OCInitStruct.TIM_OutputNState=TIM_OutputNState_Enable;
    TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
    TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCNPolarity_High;
    TIM_OCInitStruct.TIM_OCIdleState=TIM_OCIdleState_Set;
    TIM_OCInitStruct.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
    TIM_OCInitStruct.TIM_Pulse=0;
    
    TIM_OC1Init(TIM1,&TIM_OCInitStruct);//  //定时器1 通道1初始化
    TIM_OC3Init(TIM1,&TIM_OCInitStruct);//  //定时器1 通道1初始化
    //使能预装载寄存器
    TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);// //OC1预装载寄存器使能//CH1 TIM1
    TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);// //OC1预装载寄存器使能//CH1 TIM1
    //死区和刹车功能配置
    
    TIM_BDTRInitStruct.TIM_OSSIState=TIM_OSSIState_Enable;//空闲模式下的关闭状态选择
    TIM_BDTRInitStruct.TIM_OSSRState=TIM_OSSRState_Enable;//运行模式下的关闭状态选择
    TIM_BDTRInitStruct.TIM_LOCKLevel=TIM_LOCKLevel_1;//锁存配置
    
    TIM_BDTRInitStruct.TIM_DeadTime=20; //////死区时间
    
    TIM_BDTRInitStruct.TIM_BreakPolarity=TIM_BreakPolarity_Low;//断路输入极性
    
    TIM_BDTRInitStruct.TIM_Break=TIM_Break_Enable;//断路输入使能控制
    
    TIM_BDTRInitStruct.TIM_AutomaticOutput=TIM_AutomaticOutput_Enable;//自动输出极性
    TIM_BDTRConfig(TIM1,&TIM_BDTRInitStruct);
    
    TIM_ARRPreloadConfig(TIM1,ENABLE);  //允许或禁止在定时器工作时向ARR(自动重装载值)的缓冲器中写入新值,
                                       //以便在更新事件发生时载入覆盖以前的值,此处为允许
                                                                         
    
    TIM_CtrlPWMOutputs(TIM1,ENABLE);//高级定时器专属!!!--MOE主输出使能 //高级定时器TIM1:
                                    //必须有这个函数才能输出PWM: TIM_CtrlPWMOutputs(TIM1,ENABL);
    TIM_Cmd(TIM1,ENABLE);//定时器使能
}
void TIM3_PWM_Init(u16 arr,u16 psc)//TIM3 PWM初始化 arr重装载值 psc预分频系数
{  
    GPIO_InitTypeDef     GPIO_InitStrue;
    TIM_OCInitTypeDef     TIM_OCInitStrue;
    TIM_TimeBaseInitTypeDef     TIM_TimeBaseInitStrue;
    
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM3和相关GPIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB时钟(LED在PB0引脚)
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟(定时器3通道3需要重映射到BP5引脚)
    
    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;     // TIM_CH3
    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;    // 复用推挽
    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;    //设置最大输出速度
    GPIO_Init(GPIOB,&GPIO_InitStrue);                //GPIO端口初始化设置
    
    //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE); //映射,重映射只用于64、100、144脚单片机
   //当没有重映射时,TIM3的四个通道CH1,CH2,CH3,CH4分别对应PA6,PA7,PB0,PB1
   //当部分重映射时,TIM3的四个通道CH1,CH2,CH3,CH4分别对应PB4,PB5,PB0,PB1 (GPIO_PartialRemap_TIM3)
   //当完全重映射时,TIM3的四个通道CH1,CH2,CH3,CH4分别对应PC6,PC7,PC8,PC9 (GPIO_FullRemap_TIM3) 
          
    TIM_TimeBaseInitStrue.TIM_Period=arr;    //设置自动重装载值
    TIM_TimeBaseInitStrue.TIM_Prescaler=psc;        //预分频系数
    TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;    //计数器向上溢出
    TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1;        //时钟的分频因子,起到了一点点的延时作用,一般设为TIM_CKD_DIV1
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue);        //TIM3初始化设置(设置PWM的周期)
    
    TIM_OCInitStrue.TIM_OCMode=TIM_OCMode_PWM1;        // PWM模式1:CNT < CCR时输出有效电平
    TIM_OCInitStrue.TIM_OCPolarity=TIM_OCPolarity_High;// 设置极性-有效电平为:高电平
    TIM_OCInitStrue.TIM_OutputState=TIM_OutputState_Enable;// 输出使能
    TIM_OC3Init(TIM3,&TIM_OCInitStrue);        //TIM3的通道3 PWM 模式设置
    TIM_OC4Init(TIM3,&TIM_OCInitStrue);        //TIM3的通道4 PWM 模式设置
    TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);        //使能预装载寄存器
    TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable); 
    TIM_Cmd(TIM3,ENABLE);        //使能TIM3
//        TIM3_PWM_Init(pwm_f,0); //设置频率为50Hz,公式为:溢出时间Tout(单位秒)=(arr+1)(psc+1)/Tclk     
//20MS = (59999+1)*(23+1)/72000000
                         //Tclk为通用定时器的时钟,如果APB1没有分频,则就为系统时钟,72MHZ
                         //PWM时钟频率=72000000/(59999+1)*(23+1) = 50HZ (20ms),设置自动装载值60000,预分频系数24
                         //TIM_SetCompare3(TIM3,550);改变比较值TIM3->CCR2达到调节占空比的效果
 // TIM_SetCompare3(TIM3,171); 
    
}

void TIM4_PWM_Init(u16 arr,u16 psc)//TIM4 PWM初始化 arr重装载值 psc预分频系数
{  
    GPIO_InitTypeDef     GPIO_InitStrue;
    TIM_OCInitTypeDef     TIM_OCInitStrue;
    TIM_TimeBaseInitTypeDef     TIM_TimeBaseInitStrue;
    
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);////使能TIM4和相关GPIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);////使能GPIOB时钟(LED在PB0引脚)
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟(定时器3通道3需要重映射到BP5引脚)
    
    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_8;     ///// TIM_CH3  |GPIO_Pin_9;
    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;    // 复用推挽
    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;    //设置最大输出速度
    GPIO_Init(GPIOB,&GPIO_InitStrue);                //GPIO端口初始化设置
    
    TIM_TimeBaseInitStrue.TIM_Period=arr;    //设置自动重装载值
    TIM_TimeBaseInitStrue.TIM_Prescaler=psc;        //预分频系数
    TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;    //计数器向上溢出
    TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1;        //时钟的分频因子,起到了一点点的延时作用,一般设为TIM_CKD_DIV1
    TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStrue);        /////TIM4初始化设置(设置PWM的周期)
    
    TIM_OCInitStrue.TIM_OCMode=TIM_OCMode_PWM1;        // PWM模式1:CNT < CCR时输出有效电平
    TIM_OCInitStrue.TIM_OCPolarity=TIM_OCPolarity_High;// 设置极性-有效电平为:高电平
    TIM_OCInitStrue.TIM_OutputState=TIM_OutputState_Enable;// 输出使能
    TIM_OC3Init(TIM4,&TIM_OCInitStrue);        ////TIM4的通道3 PWM 模式设置
    TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable); /////使能预装载寄存器
    TIM_Cmd(TIM4,ENABLE);        //使能TIM3

    
}

void TIM1_PWM_Init(u16 arr,u16 psc){  //TIM3 PWM初始化 arr重装载值 psc预分频系数
    GPIO_InitTypeDef GPIO_InitStruct;                    //GPIO初始化
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;      //定时器初始化
    TIM_OCInitTypeDef TIM_OCInitStruct;                    //定时器通道初始化
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1 | RCC_APB2Periph_AFIO,ENABLE);//开启时钟
    
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;      // 初始化GPIO--PA8、PA11为复用推挽输出
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8 | GPIO_Pin_11;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStruct);                          //GPIO初始化
    
    TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);            //用其默认值填充每个TIM_TimeBaseInitStruct成员
    TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;      //分频因子
    TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;  //向上计数模式
    TIM_TimeBaseInitStruct.TIM_Period=arr;                      //自动重装载值
    TIM_TimeBaseInitStruct.TIM_Prescaler=psc;                    //预分频值
    TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);             //完成定时器初始化
    
    TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;                  // 初始化输出比较
    TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
    TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
    TIM_OCInitStruct.TIM_Pulse=0;
    TIM_OC1Init(TIM1,&TIM_OCInitStruct);//定时器通道1初始化
    TIM_OC4Init(TIM1,&TIM_OCInitStruct);//定时器通道4初始化
    
    TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);// OC1预装载寄存器使能//CH1 TIM1
    TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);// OC4预装载寄存器使能//CH4 TIM1
    
    TIM_ARRPreloadConfig(TIM1,ENABLE); //允许或禁止在定时器工作时向ARR(自动重装载值)的缓冲器中写入新值,以便在更新事件发生时载入覆盖以前的值,此处为允许
    TIM_CtrlPWMOutputs(TIM1,ENABLE); //高级定时器专属!!!--MOE主输出使能 //高级定时器TIM1:必须有这个函数才能输出PWM: TIM_CtrlPWMOutputs(TIM1,ENABL);
    TIM_Cmd(TIM1,ENABLE);           //定时器使能
    
//    TIM_SetCompare1(TIM1,500);//设置TIMx捕获比较1寄存器值  此处为TIM1通道1
//    TIM_SetCompare4(TIM1,500);//设置TIMx捕获比较4寄存器值  此处为TIM1通道4

}

//    TIM3_PWM_Init(pwm_f,0); //设置频率为50Hz,公式为:溢出时间Tout(单位秒)=(arr+1)(psc+1)/Tclk     20MS = (59999+1)*(23+1)/72000000
                         //Tclk为通用定时器的时钟,如果APB1没有分频,则就为系统时钟,72MHZ
                         //PWM时钟频率=72000000/(59999+1)*(23+1) = 50HZ (20ms),设置自动装载值60000,预分频系数24
                         //TIM_SetCompare3(TIM3,550);改变比较值TIM3->CCR2达到调节占空比的效果
 // TIM_SetCompare3(TIM3,171); 
  
对你有帮助吗???

 

 

 

此帖出自stm32/stm8论坛

最新回复

赞,不过建议你把代码放在论坛代码的框里  详情 回复 发表于 2023-3-23 18:17
点赞 关注
 

回复
举报

2655

帖子

6

TA的资源

五彩晶圆(初级)

沙发
 

赞,不过建议你把代码放在论坛代码的框里


此帖出自stm32/stm8论坛
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖探索 | 和村田一起,深挖 GNSS 开发!
活动时间:即日起-5月11日
活动奖励:智能手环、螺丝刀套装、双肩包

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 12

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表