找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 441|回复: 1
打印 上一主题 下一主题
收起左侧

stm32f103c8t6如何使用pwm调节四档灯光亮度

[复制链接]
跳转到指定楼层
楼主
ID:1110508 发表于 2024-2-1 15:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求助!编写的程序不知道哪里出了错!调节不了亮度#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占空比。
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1110508 发表于 2024-2-1 15:20 | 只看该作者
LED灯光接到的PA7口,PA7是定时器3的二通道
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表