☰
旋转编码器 旋转调节光亮度
2026/10/27 10:20:43 网站建设 项目流程
#include "stm32f10x.h" /************************ 毫秒级软件延时 ************************/ void delay_ms(uint32_t ms) { volatile uint32_t i,j; for(i = ms; i > 0; i--) for(j = 500; j > 0; j--); } /************************ 全局变量 ************************/ uint16_t brightness = 50; // 亮度值 0~99,对应占空比0%~99% /************************ 编码器旋转扫描 ************************/ void Encoder_Scan(void) { static uint8_t last_CLK = 1; uint8_t clk_now, dt_now; clk_now = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2); dt_now = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3); // CLK下降沿触发一次转动判断 if(last_CLK == 1 && clk_now == 0) { delay_ms(1); // 机械消抖 clk_now = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2); dt_now = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3); if(clk_now == 0) { if(dt_now == 1) // 顺时针:亮度+ { if(brightness < 99) brightness++; } if(dt_now == 0) // 逆时针:亮度- { if(brightness > 0) brightness--; } // 实时更新PWM占空比 TIM_SetCompare1(TIM3, brightness); } } last_CLK = clk_now; } /************************ TIM3 PWM初始化 ************************/ void TIM3_PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // PA6 TIM3_CH1 复用推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 时基配置:72MHz/720=100kHz计数时钟,周期100 → PWM频率1kHz TIM_TimeBaseStructure.TIM_Period = 100 - 1; TIM_TimeBaseStructure.TIM_Prescaler = 720 - 1; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 输出比较:PWM1模式,高电平有效 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_Pulse = brightness; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_Cmd(TIM3, ENABLE); } /************************ 编码器GPIO初始化 ************************/ void Encoder_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // PA2 CLK、PA3 DT 上拉输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); } /************************ 主函数 ************************/ int main(void) { Encoder_GPIO_Init(); TIM3_PWM_Init(); while(1) { Encoder_Scan(); // 循环扫描编码器,调节亮度 } }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询