• 使用PWM实现呼吸灯功能


    CC表示的意思位捕获比较,CCR表示的是捕获比较寄存器

    占空比等效于PWM模拟出来的电压的多少,占空比越大等效出的模拟电压越趋近于高电平,占空比越小等效出来的模拟电压越趋近于低电平,分辨率表示的是占空比变化的精细程度,按照实际项目的需求使用PWM波形可以在数字系统等效输出模拟量,可以实现LED控制亮度和控制电机的速度等操作

    输出模式控制器是如何工作的

    可以理解为:配置有效的电平就是设置高电平,配置无效的电平就是设置的低电平

    舵机简介

    电机驱动模块的硬件电路

    接线图:PWM驱动呼吸灯

    // 配置输出比较模块

    //第一个参数的意思是选择定时器,第二个参数的意思是配置结构体

    void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
    void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
    void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
    void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

    void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct); // 给输出比较结构体赋值一个默认值

    // 配置强制输出模式

    void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
    void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
    void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
    void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);

    //配置CCR寄存器的预装功能

    void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState);
    void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
    void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
    void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
    void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

    // 配置快速使能

    void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
    void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
    void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
    void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);

    这个不是重点内容

    void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
    void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
    void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
    void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);

    // 单独设置输出比较的极性

    void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
    void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
    void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
    void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
    void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
    void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
    void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);

    // 单独修改使能输出参数

    void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);
    void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);

    // 选择输出比较模式

    void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);

    **// 单独更改CCR寄存器值的函数,比较重要**

    void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
    void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
    void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
    void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);

    PWM的C语言文件

    使用PWM实现呼吸灯的效果

    1. #include "stm32f10x.h" // Device header
    2. void PWM_Init(void){
    3. // 开启时钟,这里TIM2是通用寄存器
    4. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
    5. // GPIO初始化代码
    6. /*开启时钟*/
    7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟
    8. // GPIO引脚重映射,表示重映射和引脚之间的关系
    9. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    10. GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);
    11. GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
    12. /*GPIO初始化*/
    13. GPIO_InitTypeDef GPIO_InitStructure;
    14. // 使用复用开漏推挽输出模式
    15. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    16. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
    17. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    18. GPIO_Init(GPIOA, &GPIO_InitStructure); //将PA1和PA2引脚初始化为推挽输出
    19. // 选择时基单元的时钟,选择内部时钟的模式,定时器默认使用的是内部单元的时钟
    20. TIM_InternalClockConfig(TIM2);
    21. // 配置时基单元,初始化结构体
    22. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    23. // 将结构体成员都引用出来放置在这个位置
    24. TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 配置参数是否分屏
    25. TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up; // 选择计数的模式选择向上计数
    26. TIM_TimeBaseInitStructure.TIM_Period = 100 -1; // 表示ARR自动重装器的值,这两个参数的取值都要在0-65535之间
    27. TIM_TimeBaseInitStructure.TIM_Prescaler = 720-1; // PSC预分频器的值
    28. TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; // 重复计数器的值
    29. // 初始化结构体并将结构体的地址放置在init函数中
    30. TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
    31. // 初始化输出比较单元
    32. TIM_OCInitTypeDef TIM_OCInitStructure;
    33. // 给结构体赋初始值
    34. TIM_OCStructInit(&TIM_OCInitStructure);
    35. // 设置输出比较的模式
    36. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    37. // 设置输出比较的极性,选择高极性
    38. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    39. // 设置输出使能,输出状态
    40. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable ;
    41. //设置CCR,设置ccr寄存器的值
    42. TIM_OCInitStructure.TIM_Pulse = 0; // CCR
    43. TIM_OC1Init(TIM2, &TIM_OCInitStructure);
    44. // 启动定时器
    45. TIM_Cmd(TIM2, ENABLE);
    46. }
    47. void PWM_SetCompare1(uint16_t Compare){
    48. TIM_SetCompare1(TIM2,Compare);
    49. }

    PWM头文件

    1. #ifndef __PWM_H_
    2. #define __PWM_H_
    3. void PWM_Init(void);
    4. void PWM_SetCompare1(uint16_t Compare);
    5. #endif

    main主函数文件

    1. #include "stm32f10x.h" // Device header
    2. #include "Delay.h"
    3. #include "OLED.h"
    4. #include "PWM.h"
    5. uint8_t i;
    6. int main(void)
    7. {
    8. // 初始化oled
    9. OLED_Init();
    10. PWM_Init();
    11. while (1)
    12. {
    13. for(i = 0; i<= 100; i++){
    14. // 这个函数是设置CCR寄存器的值,不直接是占空比
    15. PWM_SetCompare1(i);
    16. Delay_ms(10);
    17. }
    18. for(i = 0; i<= 100; i++){
    19. PWM_SetCompare1(100 - i);
    20. Delay_ms(10);
    21. }
    22. }
    23. }

     

  • 相关阅读:
    TCP/UDP 通信问题整理
    网络安全—DDoS攻防
    天锐绿盾透明加密、半透明加密、智能加密这三种不同加密模式的区别和适用场景——@德人合科技-公司内部核心文件数据、资料防止外泄系统
    从pcap文件中提取pcma音频
    Java基础----多线程
    【PWN】03.ret2syscall
    200、使用默认 Exchange 实现 P2P 消息 之 消息生产者(发送消息) 和 消息消费者(消费消息)
    eval有时候也可以用,而且有奇效
    Linux 常用命令学习笔记
    第一百零六篇:变量的不同声明(var,let和const的不同)
  • 原文地址:https://blog.csdn.net/qq_45973003/article/details/136765404