[其他ST产品] stm32f407VET6 系统学习 day07 通用定时器, OLED 屏幕使用 PWM 的使用

[复制链接]
2070|56
 楼主| 花间一壶酒sd 发表于 2023-3-29 13:03 | 显示全部楼层
  mian.cpp 文件
  1. #include "stm32f4xx.h"                  // Device header
  2. #include "mysistick.h"
  3. #include "at24c02.h"
  4. #include "myiic.h"
  5. #include "myusart.h"
  6. #include "oled.h"
  7. #include "led.h"
  8. #include "wwdg.h"
  9. #include "mytim.h"
  10. #define PWM_TEST

  11. int main(void)
  12. {
  13.      #ifdef PWM_TEST
  14.                 //写一个循环 改变占空比的值 。
  15.                         unsigned int beepvalue = 0 ;
  16.                         unsigned char ** = 1 ;
  17.                         systickConfig(168);
  18.                         Timer2pwminit();
  19.                         while(1){                                       
  20.                                        
  21.                                         if(**)                        beepvalue++;
  22.                                         else                        beepvalue--;                                       
  23.                                         if(beepvalue > 500)        ** = 0 ;                                       
  24.                                         if(beepvalue == 0)        ** = 1 ;
  25.                                        
  26.                                         //比较寄存器修改的是 占空比。
  27.                                         TIM_SetCompare3(TIM2,beepvalue);
  28.                                         //TIM2->ARR = beepvalue;
  29.                                         //beep的变化范围是 0 - 61;
  30.                
  31.                         }
  32.         #endif




  33. return 0;
  34. }


 楼主| 花间一壶酒sd 发表于 2023-3-29 13:04 | 显示全部楼层
程序功能:  PWM  形成 呼吸灯

头文件


  1. #ifndef _TIMER_H
  2. #define _TIMER_H
  3. void TIM14_PWM_Init(void);
  4. #endif
 楼主| 花间一壶酒sd 发表于 2023-3-29 13:04 | 显示全部楼层
.cpp 文件
  1. #include "pwm.h"
  2. #include "led.h"

  3. //TIM14 PWM部分初始化
  4. //PWM输出初始化
  5. //arr:自动重装值
  6. //psc:时钟预分频数
  7. void TIM14_PWM_Init(void)
  8. {                                                          
  9.         //此部分需手动修改IO口设置       
  10.         GPIO_InitTypeDef GPIO_InitStructure;
  11.         //定时器结构体初始化。
  12.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  13.        
  14.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  15.         //1TIM14时钟使能
  16.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);         
  17.         2使能PORTF时钟
  18.         TIM_DeInit(TIM1);
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);                
  20.         //3GPIOF9复用为定时器14
  21.         GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_TIM1);

  22.         //GPIOF9
  23.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;   
  24.         //复用功能
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  
  26.         //速度100MHz
  27.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;  
  28.         //推挽复用输出
  29.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;   
  30.         //上拉
  31.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  
  32.         //4初始化PF9
  33.         GPIO_Init(GPIOE,&GPIO_InitStructure);              
  34.           
  35.         TIM_TimeBaseStructure.TIM_Prescaler=400;  //定时器分频
  36.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
  37.         TIM_TimeBaseStructure.TIM_Period=100;   //自动重装载值
  38.         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  39. //        TIM_TimeBaseStructure.TIM_RepetitionCounter = 1;
  40.         //5初始化定时器14
  41.         TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
  42.        
  43.         //初始化TIM14 Channel1 PWM模式       
  44.         //选择定时器模式:TIM脉冲宽度调制模式2
  45.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                 
  46.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  47.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  48.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
  49.         //6根据T指定的参数初始化外设TIM1 4OC1
  50. //        TIM_OCInitStructure.TIM_Pulse = 100;
  51.         TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  52.   
  53.         //7使能TIM14在CCR1上的预装载寄存器
  54. //        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  
  55. //        //8ARPE使能
  56. //        TIM_ARRPreloadConfig(TIM1,ENABLE);
  57.         //9使能TIM14
  58.         TIM_Cmd(TIM1, ENABLE);         
  59.         TIM_CtrlPWMOutputs(TIM1, ENABLE);               
  60. }  

 楼主| 花间一壶酒sd 发表于 2023-3-29 13:04 | 显示全部楼层
main.cpp
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "pwm.h"         

  6. int main(void)
  7. {
  8.         u16 led0pwmval=0;   
  9.         u8 dir=1;
  10.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  11.         delay_init(168);  //初始化延时函数
  12.         //uart_init(115200);//初始化串口波特率为115200
  13.         TIM14_PWM_Init();        //84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz.     
  14.         while(1) //实现比较值从0-300递增,到300后从300-0递减,循环
  15.         {
  16.                 delay_ms(10);
  17.                 //dir==1 led0pwmval递增
  18.                 if(dir)
  19.                         led0pwmval++;
  20.                 else     //dir==0 led0pwmval递减
  21.                         led0pwmval--;
  22.                 //led0pwmval到达300后,方向为递减
  23.                 if(led0pwmval>100)
  24.                         dir=0;
  25.                 //led0pwmval递减到0后,方向改为递增
  26.                 if(led0pwmval==0)
  27.                         dir=1;       
  28.                
  29.                 //修改比较值,修改占空比       
  30.                 TIM_SetCompare1(TIM1,led0pwmval);       
  31.         }
  32. }
wenfen 发表于 2023-3-29 21:12 | 显示全部楼层
计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。
tian111 发表于 2023-3-29 21:17 | 显示全部楼层
生成不同的定时器输入时钟源TIMxCLK(也就是定时器的CK_INT)
zhuhuis 发表于 2023-3-29 21:19 | 显示全部楼层
APB1总线上的定时器有:TIM2、3、4、5、12、13、14,这些定时器的输入时钟源CK_INT就是84MHZ
songqian17 发表于 2023-3-29 21:21 | 显示全部楼层
APB2总线上的定时器有:TIM1、8、9、10、11,这些定时器的输入时钟源CK_INT就是168MHZ。
chenho 发表于 2023-3-29 21:23 | 显示全部楼层
定时器的溢出时间 =10000*8400 / (84MHZ) = 1s
tian111 发表于 2023-3-29 21:25 | 显示全部楼层
注意:ARR是16位的,PSC也是16位的,最大取值都为65535.
tian111 发表于 2023-3-30 19:05 | 显示全部楼层
51单片机lO口输出一个脉冲,是指IO口发生一次高低电平的变化吧
songqian17 发表于 2023-3-30 19:10 | 显示全部楼层
调整PWM占空比就是调整PWM高电平的持续时间
午夜粪车 发表于 2023-3-30 19:12 | 显示全部楼层
需要检查TIM3是否有更新事件的中断
公羊子丹 发表于 2024-2-5 07:09 | 显示全部楼层

PCB的制造过程由玻璃环氧树脂(Glass Epoxy)或类似材质制成的PCB“基板”开始
Uriah 发表于 2024-2-5 09:15 | 显示全部楼层

引线上的电压降比较大
帛灿灿 发表于 2024-2-5 11:11 | 显示全部楼层

PCB也会使电源工作不稳定
帛灿灿 发表于 2024-2-5 11:11 | 显示全部楼层

PCB也会使电源工作不稳定
Bblythe 发表于 2024-2-5 12:14 | 显示全部楼层
周半梅 发表于 2024-2-5 14:10 | 显示全部楼层

负片转印(Subtractive transfer)的方式将设计好的PCB线路板的线路底片“印刷”在金属导体上。
Pulitzer 发表于 2024-2-5 15:13 | 显示全部楼层

输出滤波电容存储来自输出整流器的高频能量
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部