找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stm32 PWM 用定时器写的

[复制链接]
跳转到指定楼层
楼主
ID:364826 发表于 2018-7-30 19:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #include "sys.h"


  4. void Delay(u32 count)
  5. {
  6.    u32 i=0;
  7.    for(;i<count;i++);
  8. }
  9. void NVIC_Configuration(void)
  10. {

  11.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

  12. }

  13. /****************************************************************
  14. * 函数名:void GPIO_Config(void)
  15. * 描述  :配置复用输出PWM时用到的I/O
  16. * 输入  :无
  17. * 输出  :无
  18. * 调用  :main()调用
  19.    PA6       PA7    两路  PWM
  20. ***************************************************************/
  21. void GPIO_Config(void)  
  22. {
  23.   GPIO_InitTypeDef GPIO_InitStructure;

  24.   /* GPIOA and GPIOB clock enable */
  25.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);  //

  26.   /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
  27.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
  28.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;           // 复用推挽输出
  29.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  30.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  31. }

  32. /****************************************************************
  33. * 函数名:void TIM3_Config(void)  
  34. * 描述  :配置TIM3输出的PWM信号的模式
  35. *      CH1:输出 T=2.5ms(f=1/2.5ms=400Hz) 占空比D=0.6的PWM波(高电平在前,低电平在后)
  36. *      CH2:输出 T=2.5ms(f=1/2.5ms=400Hz)       D=0.4的PWM波(高电平在后,低电平在前)
  37. *      步骤一:通过T和TIMxCLK的时钟源确定TIM_Period和TIM_Prescaler  (计数值和预分频)
  38. *          T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=2.5ms  
  39. *          因为 TIM_Period<65535,所以 TIM_Prescaler>1,即 TIM_Prescaler=2     //(预分频 参数)
  40. *          所以 TIM_Period=59999=0xEA5F        //计数值
  41. *      步骤二:根据TIM_Period的值,高低电平的先后D,确定CCR和TIM_OCPolarity
  42. *          CH1:因为D=0.6,先高后低;
  43. *              所以CCR1=(TIM_Period+1)* D=36000;TIM_OCPolarity=TIM_OCPolarity_High
  44. *          CH2:因为D=0.4,先高后低;
  45. *              所以CCR1=(TIM_Period+1)* (1-D)=36000;TIM_OCPolarity=TIM_OCPolarity_Low
  46. *      步骤三:基础寄存器初始化
  47. *      步骤四:通道寄存器初始化
  48. *      步骤五:使能TIM3重载寄存器ARR
  49. *      步骤六:使能TIM3  
  50. * 输入  :无  
  51. * 输出  :无  
  52. * 调用  :main()调用  
  53. ***************************************************************/  
  54. void TIM3_Config(u16 arr,u16 CCR1,u16 CCR2)  
  55. {  




  56.   
  57.           TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;  
  58.     TIM_OCInitTypeDef          TIM_OCInitStructure;        
  59.        
  60.           /*PCLK1经过2倍频后作为TIM3的时钟源等于72MHz*/  
  61.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);       
  62.                
  63.     /* Time base configuration 47999*/                                            
  64.           TIM_TimeBaseStructure.TIM_Period =arr;       //  计数值  47999
  65.     TIM_TimeBaseStructure.TIM_Prescaler = 720;            //设置预分频:预分频=2,即为72/3=24MHz  预分频(时钟分频)72M/(2+1)=24M
  66.        
  67.    
  68.     TIM_TimeBaseStructure.TIM_ClockDivision = 0;                                //设置时钟分频系数:不分频  
  69.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                 //向上计数溢出模式  
  70.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);  
  71.     /* PWM1 Mode configuration: Channel1 */  
  72.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                           //配置为PWM模式1  
  73.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
  74.                
  75.     TIM_OCInitStructure.TIM_Pulse = CCR1;                                       //设置跳变值,当计数器计数到这个值时,电平发生跳变  
  76.     TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;                    //当定时器计数值小于CCR1时为高电平  

  77.                 TIM_OC1Init(TIM3, &TIM_OCInitStructure);                                    //使能通道1      
  78.     TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

  79.                
  80.     /* PWM1 Mode configuration: Channel2 */  
  81.                 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  82.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
  83.     TIM_OCInitStructure.TIM_Pulse = CCR2;                                       //设置通道2的电平跳变值,输出另外一个占空比的PWM  
  84.      //TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                    //当定时器计数值小于CCR2时为低电平
  85.      TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                    //当定时器计数值小于CCr2 时为高电平
  86.                 TIM_OC2Init(TIM3, &TIM_OCInitStructure);                                    //使能通道2  
  87.     TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
  88.                
  89.     TIM_ARRPreloadConfig(TIM3, ENABLE);                                         //使能TIM3重载寄存器ARR  
  90.     /* TIM3 enable counter */  
  91.     TIM_Cmd(TIM3, ENABLE);                                                      //使能TIM3   
  92.         }       
  93. /***************************************************************
  94. * 函数名:main
  95. * 描述  :主函数
  96. * 输入  :无
  97. * 输出  :无
  98. ***************************************************************/
  99. int main(void)
  100. {
  101.                
  102.           u16 CCR1=80;
  103.           u16 CCR2=80;
  104.           delay_init();                  //延时初始化
  105.     SystemInit();   /* 配置系统时钟为72M */
  106.           NVIC_Configuration();
  107.     GPIO_Config();
  108.     TIM3_Config(1999,CCR1,CCR2);
  109.           delay_ms(1500);
  110.           delay_ms(1500);
  111.           
  112.        
  113.                

  114.        
  115.                

  116.          // TIM3_Init();
  117.     while (1)
  118.     {
  119.                        
  120.                         TIM3->CCR2=140;
  121.                         TIM3->CCR2=140;
  122.             
  123.                        
  124.     }
  125. }

复制代码

所有资料51hei提供下载:
PWM.rar (285.54 KB, 下载次数: 21)


评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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