找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1312|回復(fù): 1
收起左側(cè)

stm32f103c8t6如何使用pwm調(diào)節(jié)四檔燈光亮度

[復(fù)制鏈接]
ID:1110508 發(fā)表于 2024-2-1 15:10 | 顯示全部樓層 |閱讀模式
求助!編寫的程序不知道哪里出了錯(cuò)!調(diào)節(jié)不了亮度#include "stm32f10x.h"                   //包含stm32f10x.h的頭文件
void delay_nms(uint16_t ms) //定義毫秒延時(shí)子函數(shù)
{
                uint16_t i;//定義無符號(hào)字符型
                for(;ms>0;ms--)        //毫秒級(jí)
                for(i=10000;i>0;i--);       
}

//LED的初始化配置函數(shù)
void LED_config(void)                                                                                                       
{
        GPIO_InitTypeDef gpio;         //定義InitTypeDef類型的結(jié)構(gòu)體指針 gpio
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA的外設(shè)時(shí)鐘
        gpio.GPIO_Mode=GPIO_Mode_AF_PP;//復(fù)用推挽輸出
        gpio.GPIO_Pin=GPIO_Pin_7;
        gpio.GPIO_Speed=GPIO_Speed_2MHz;                                //速度50MHZ
        GPIO_Init(GPIOA,&gpio);                                                                  //調(diào)用GPIO_Init函數(shù) 對(duì)GPIOA口初始化
}

void KEY_config(void) //KEY_按鍵的初始化配置函數(shù)
{
                GPIO_InitTypeDef gpio;                 //定義結(jié)構(gòu)體
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);        //使能GPIOA的時(shí)鐘
                gpio.GPIO_Mode=GPIO_Mode_IPU;        //輸入上拉模式
                gpio.GPIO_Pin=GPIO_Pin_15;
          GPIO_Init(GPIOA,&gpio);                          //GPIOA口初始化
}

uint8_t KEY_scan(void) //判別哪個(gè)按鍵按下程序 按鍵掃描
{
                uint8_t rtl;        //定義一個(gè)rtl,用來接收按鍵返回的值
                if((GPIO_ReadInputData(GPIOA)&0xF)==0XF)// 判別是否有 鍵按下
                return 0xff;                //如果沒有按鍵按下,返回FF
                delay_nms(10);        //延時(shí)消抖
                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定時(shí)器中斷PWM波的初始化配置
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        TIM_OCInitTypeDef TIM_OCInitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
       
        /* 開啟時(shí)鐘 */
        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;//復(fù)用推挽輸出
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        TIM_TimeBaseInitStructure.TIM_Period=per;   //自動(dòng)裝載值
        TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分頻系數(shù)
        TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //設(shè)置向上計(jì)數(shù)模式
        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 上的預(yù)裝載寄存器
        TIM_ARRPreloadConfig(TIM3,ENABLE);//使能預(yù)裝載寄存器
       
        TIM_Cmd(TIM3,ENABLE); //使能定時(shí)器               
}
int main(void)
{
        uint16_t PWM=1000; //定義PWM波初始值為1000   即CRR的值
        LED_config();//初始化燈
        KEY_config();//初始化按鍵
        TIM3_CH2_PWM_Init(500,72-1);        //初始化PWM函數(shù)
        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);//函數(shù),把PWM變量的值寫入TIM2的輸出通道3的CCR寄存器中,修改PWM占空比。
        }
}

回復(fù)

使用道具 舉報(bào)

ID:1110508 發(fā)表于 2024-2-1 15:20 | 顯示全部樓層
LED燈光接到的PA7口,PA7是定時(shí)器3的二通道
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表