STM32暂时关闭PWM占空比输出功能,并把GPIO置高或低

1、  

TIM_ForcedOC2Config(TIM3, TIM_ForcedAction_InActive);

2、重新使用pwm的话需要重新配置

/*重新输出PWM*/

TIM_SelectOCxM(TIM3, TIM_Channel_2, TIM_OCMode_PWM1);

TIM_CCxCmd(TIM3, TIM_Channel_2, TIM_CCx_Enable);

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
## 方案 基本:控制电机的启动、停止和调整转速。对于直流电机来讲,使用 PWM 来驱动电机是控制转速的一种方法,而 STM32 通用定时器提供了输出 PWM 脉冲的功能,故决定通过通用定时器控制 GPIO 进行脉冲输出。 扩展:显示速度、超速报警、开机解锁。针对速度显示,使用 LED 灯的数量代表速度档位;针对超速报警,超过,则报警(LED 或声音);针对开机解锁,开机输入四位密码,输入正确解锁,错误则报警,直至重启。 ## 具体实现 1. 控制电机的具体实现:利用EXTI按键中断,在中断函数中调用PWM调节函数来调整PWM占空比,实现调节电机转速。 2. 显示速度档位的具体实现:在调节转速的函数中调用LED显示函数,LED显示函数根据形参对LED亮灭个数进行配,实现速度档位显示。 3. 开机密码锁的具体实现:要点是编写矩阵键盘扫描函数,主函数将在一开始时进入循环,调用扫描函数,来判断是否符合正确密码的要求。 ## 器件或模块选择 - 直流电机 - GPIO 模块 - TIM 模块 - 矩阵键盘 - LED 灯 ## 主程序流程图设计 ![](Doc/main.png) ## 具体功能流程图设计 ![](Doc/1.png) ![](Doc/2.png) ## 关键问题或程序关键段落说明 1. 驱动蜂鸣器:相应的 GPIO 口应该设为 OD 输出。 2. 如何能判断扫描到的数值有效?可以先将扫描到的键值赋给一个变量,检查该变量是否符合要求。 3. 中断服务中如何修改 PWM 占空比?可以调用增速、减速或停止的函数,函数中修改电平跳变时间。 ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
以下是一个基于STM32的按键控制PWM占空比的示例代码,使用TIM2通道2和GPIOA的第0号引脚作为PWM输出引脚。其中,按键按下时占空比增加10%,松开时占空比归零。 ```c #include "stm32f10x.h" // 初始化TIM2通道2为PWM输出模式 void TIM2_PWM_Init(void) { // 使能TIM2时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 定时器初始化结构体 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_TimeBaseInitStructure.TIM_Period = 999; // 设周期为1000 TIM_TimeBaseInitStructure.TIM_Prescaler = 71; // 设预分频为72 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频为1 TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); // PWM模式初始化结构体 TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 输出使能 TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比为0 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 输出电平为 TIM_OC2Init(TIM2, &TIM_OCInitStructure); // 使能TIM2定时器 TIM_Cmd(TIM2, ENABLE); } // 初始化GPIOA的第0号引脚为复用推挽输出 void GPIOA_Init(void) { // 使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIO初始化结构体 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 第0号引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最大输出速率为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); } // 初始化按键为输入模式 void Button_Init(void) { // 使能GPIOB时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIO初始化结构体 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 第0号引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最大输入速率为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); } int main(void) { // 初始化TIM2和GPIOA TIM2_PWM_Init(); GPIOA_Init(); // 初始化按键 Button_Init(); // 记录按键上一次状态 uint8_t last_state = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0); // 循环读取按键状态并更新占空比 while (1) { uint8_t state = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0); // 检测按键状态是否发生变化 if (state != last_state) { last_state = state; // 按键按下时增加占空比10% if (state == 0) { uint16_t pulse = TIM_GetCapture2(TIM2); pulse += 100; if (pulse > 999) pulse = 999; TIM_SetCompare2(TIM2, pulse); } // 按键松开时占空比归零 else { TIM_SetCompare2(TIM2, 0); } } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值