标题: stm32f103c8t6如何使用pwm调节四档灯光亮度 [打印本页]

作者: 2369515798    时间: 2024-2-1 15:10
标题: stm32f103c8t6如何使用pwm调节四档灯光亮度
求助!编写的程序不知道哪里出了错!调节不了亮度#include "stm32f10x.h"                   //包含stm32f10x.h的头文件
void delay_nms(uint16_t ms) //定义毫秒延时子函数
{
                uint16_t i;//定义无符号字符型
                for(;ms>0;ms--)        //毫秒级
                for(i=10000;i>0;i--);       
}

//LED的初始化配置函数
void LED_config(void)                                                                                                       
{
        GPIO_InitTypeDef gpio;         //定义InitTypeDef类型的结构体指针 gpio
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA的外设时钟
        gpio.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
        gpio.GPIO_Pin=GPIO_Pin_7;
        gpio.GPIO_Speed=GPIO_Speed_2MHz;                                //速度50MHZ
        GPIO_Init(GPIOA,&gpio);                                                                  //调用GPIO_Init函数 对GPIOA口初始化
}

void KEY_config(void) //KEY_按键的初始化配置函数
{
                GPIO_InitTypeDef gpio;                 //定义结构体
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);        //使能GPIOA的时钟
                gpio.GPIO_Mode=GPIO_Mode_IPU;        //输入上拉模式
                gpio.GPIO_Pin=GPIO_Pin_15;
          GPIO_Init(GPIOA,&gpio);                          //GPIOA口初始化
}

uint8_t KEY_scan(void) //判别哪个按键按下程序 按键扫描
{
                uint8_t rtl;        //定义一个rtl,用来接收按键返回的值
                if((GPIO_ReadInputData(GPIOA)&0xF)==0XF)// 判别是否有 键按下
                return 0xff;                //如果没有按键按下,返回FF
                delay_nms(10);        //延时消抖
                if((GPIO_ReadInputData(GPIOA)&0XF)==0XF) //再次判别是否有键按下_
                return 0xff;                //如果没有按键按下,返回FF
                rtl=GPIO_ReadInputData(GPIOA)&0xF;                //返回键值               
                while((GPIO_ReadInputData(GPIOA)&0XF)!=0XF); //等待按键释放
                return rtl;                        //返回键值                                                                                                               
}

void TIM3_CH2_PWM_Init(u16 per,u16 psc)//TIM2定时器中断PWM波的初始化配置
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        TIM_OCInitTypeDef TIM_OCInitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
       
        /* 开启时钟 */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
       
        /*  配置GPIO的模式和IO口 */
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        TIM_TimeBaseInitStructure.TIM_Period=per;   //自动装载值
        TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数
        TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);       
       
        TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
        TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
        TIM_OC2Init(TIM3,&TIM_OCInitStructure); //输出比较通道2初始化
       
        TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); //使能TIMx在 CCR2 上的预装载寄存器
        TIM_ARRPreloadConfig(TIM3,ENABLE);//使能预装载寄存器
       
        TIM_Cmd(TIM3,ENABLE); //使能定时器               
}
int main(void)
{
        uint16_t PWM=1000; //定义PWM波初始值为1000   即CRR的值
        LED_config();//初始化灯
        KEY_config();//初始化按键
        TIM3_CH2_PWM_Init(500,72-1);        //初始化PWM函数
        while(1)
        {
                if(KEY_scan()==0xe)//按键按下
                {
                        PWM-=200;   //CCR的值右移一位,即除以2     原始PWM值:100%  按键按一次除一次为: 50%,25%,12.5%
                        if(PWM==0)//若CCR和seg的值小于125,则再赋值=为1000。
                        {
                                PWM=1000;
                        }
                }
                        TIM_SetCompare2(TIM3,PWM);//函数,把PWM变量的值写入TIM2的输出通道3的CCR寄存器中,修改PWM占空比。
        }
}


作者: 2369515798    时间: 2024-2-1 15:20
LED灯光接到的PA7口,PA7是定时器3的二通道




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1