找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

這是stm32根據(jù)環(huán)境亮度自動調(diào)節(jié)燈光亮度的代碼,跑不起來求大佬看一看

[復(fù)制鏈接]
ID:1039168 發(fā)表于 2023-12-13 09:00 | 顯示全部樓層 |閱讀模式
下載到單片機里燈閃一下就滅了,不知道是什么原因main.c


#include "led.h"
#include "delay.h"
#include "sys.h"
#include "adc.h"
#include "lsens.h"
#include "timer.h"
   
u8 adcx=0;                           //光敏傳感器ADC轉(zhuǎn)換值


int main(void)
{         
        delay_init();                          //延時函數(shù)初始化          
        LED_Init();                                      //初始化與LED連接的硬件接口
                            
        Lsens_Init();                               //初始化光敏傳感器
       
        TIM3_PWM_Init(100,0);
        TIM4_Int_Init(1999,35999);
                      
   
         while(1)
                        {
                        adcx=Lsens_Get_Val();
                                       
                                if((adcx>0)&&(adcx<=20))                        //當(dāng)前環(huán)境亮度小于20,燈光亮度調(diào)至最高的第五檔
                                {
                                        TIM_SetCompare2(TIM3,100);
                                        delay_ms(10);
                                }
                                if((adcx>20)&&(adcx<=40))                       //當(dāng)前環(huán)境亮度小于40大于20,燈光亮度調(diào)至第四檔
                                {
                                        TIM_SetCompare2(TIM3,80);
                                        delay_ms(10);
                                }
                                if((adcx>40)&&(adcx<=60))                       //當(dāng)前環(huán)境亮度小于60大于40,燈光亮度調(diào)至第三檔
                                {
                                        TIM_SetCompare2(TIM3,60);
                                        delay_ms(10);
                                }
                                if((adcx>60)&&(adcx<=80))                        //當(dāng)前環(huán)境亮度小于80大于60,燈光亮度調(diào)至第二檔
                                {
                                        TIM_SetCompare2(TIM3,40);
                                        delay_ms(10);
                                }
                                if((adcx>80)&&(adcx<=95))                        //當(dāng)前環(huán)境亮度小于95大于80,燈光亮度調(diào)至第一檔
                                {
                                        TIM_SetCompare2(TIM3,20);
                                        delay_ms(10);
                                }
                                if((adcx>95)&&(adcx<=100))                       //當(dāng)前環(huán)境亮度小于100大于95,關(guān)閉燈光
                                {
                                        TIM_SetCompare2(TIM3,0);
                                        delay_ms(10);
                                }
                        }
       
}




adc.c


#include "delay.h"
#include "sys.h"


//初始化ADC1
                                                                                                                                          
void  Adc1_Init(void)
{      
        ADC_InitTypeDef ADC_InitStructure;


        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1        , ENABLE );          //使能ADC1通道時鐘
       
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);//ADC復(fù)位
       
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);//復(fù)位結(jié)束            
       
        ADC_DeInit(ADC1);  //復(fù)位ADC1,將外設(shè) ADC1的全部寄存器重設(shè)為缺省值
       
       
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC工作模式: 獨立模式
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;        //模數(shù)轉(zhuǎn)換工作在單通道模式
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //模數(shù)轉(zhuǎn)換工作在單次轉(zhuǎn)換模式
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //轉(zhuǎn)換由軟件而不是外部觸發(fā)啟動
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC數(shù)據(jù)右對齊
        ADC_InitStructure.ADC_NbrOfChannel = 1;        //順序進(jìn)行規(guī)則轉(zhuǎn)換的ADC通道的數(shù)目
        ADC_Init(ADC1, &ADC_InitStructure);        //根據(jù)ADC_InitStruct中指定的參數(shù)初始化外設(shè)ADCx的寄存器  


       
        ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1
       
        ADC_ResetCalibration(ADC1);        //使能復(fù)位校準(zhǔn)  
         
        while(ADC_GetResetCalibrationStatus(ADC1));        //等待復(fù)位校準(zhǔn)結(jié)束
       
        ADC_StartCalibration(ADC1);         //開啟AD校準(zhǔn)

        while(ADC_GetCalibrationStatus(ADC1));         //等待校準(zhǔn)結(jié)束
}                 
//獲得ADC1某個通道的值
//ch:通道值 0~16
//返回值:轉(zhuǎn)換結(jié)果
u16 Get_Adc1(u8 ch)   
{
  //設(shè)置指定ADC的規(guī)則組通道,一個序列,采樣時間
        ADC_RegularChannelConfig(ADC1,ch,1, ADC_SampleTime_239Cycles5 );        //ADC1,ADC通道,采樣時間為239.5周期                                      
  
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的軟件轉(zhuǎn)換啟動功能       
         
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待轉(zhuǎn)換結(jié)束


        return ADC_GetConversionValue(ADC1);        //返回最近一次ADC1規(guī)則組的轉(zhuǎn)換結(jié)果
}



lsens.c光敏電阻


#include "lsens.h"
#include "delay.h"

//初始化光敏傳感器
void Lsens_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
       
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTF時鐘       
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PF8 anolog輸入
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模擬輸入引腳
        GPIO_Init(GPIOA, &GPIO_InitStructure);       
        Adc1_Init();
}
//讀取Light Sens的值
//0~100:0,最暗;100,最亮
u8 Lsens_Get_Val(void)
{
        u32 temp_val=0;
        u8 t;
        for(t=0;t<LSENS_READ_TIMES;t++)
        {
                temp_val+=Get_Adc1(LSENS_ADC_CHX);        //讀取ADC值
                delay_ms(5);
        }
        temp_val/=LSENS_READ_TIMES;//得到平均值
        if(temp_val>4000)temp_val=4000;
        return (u8)(100-(temp_val/40));
}


timer.c

#include "timer.h"
#include "led.h"
#include "usart.h"
#include "lsens.h"
#include "adc.h"
#include "lsens.h"           
//通用定時器3中斷初始化
//這里時鐘選擇為APB1的2倍,而APB1為36M
//arr:自動重裝值。
//psc:時鐘預(yù)分頻數(shù)




void TIM3_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;


        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //時鐘使能


        TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個更新事件裝入活動的自動重裝載寄存器周期的值         計數(shù)到5000為500ms
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來作為TIMx時鐘頻率除數(shù)的預(yù)分頻值  10Khz的計數(shù)頻率  
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時鐘分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數(shù)模式
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時間基數(shù)單位

        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中斷,允許更新中斷


        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中斷
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占優(yōu)先級0級
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //從優(yōu)先級3級
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)NVIC寄存器


        TIM_Cmd(TIM3, ENABLE);  //使能TIMx外設(shè)
                                                         
}




//定時器3中斷服務(wù)程序
void TIM3_IRQHandler(void)   //TIM3中斷
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //檢查指定的TIM中斷發(fā)生與否:TIM 中斷源
                {
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中斷待處理位:TIM 中斷源
                LED0=!LED0;
                }
}


//TIM3 PWM部分初始化
//PWM輸出初始化
//arr:自動重裝值
//psc:時鐘預(yù)分頻數(shù)
void TIM3_PWM_Init(u16 arr,u16 psc)
{  
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
       


        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //使能定時器3時鐘
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外設(shè)和AFIO復(fù)用功能模塊時鐘
       
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5   

   //設(shè)置該引腳為復(fù)用輸出功能,輸出TIM3 CH2的PWM脈沖波形        GPIOB.5
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //復(fù)用推挽輸出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

   //初始化TIM3
        TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個更新事件裝入活動的自動重裝載寄存器周期的值
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來作為TIMx時鐘頻率除數(shù)的預(yù)分頻值
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時鐘分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數(shù)模式
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時間基數(shù)單位
       
        //初始化TIM3 Channel2 PWM模式         
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時器模式:TIM脈沖寬度調(diào)制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
        TIM_OCInitStructure.TIM_Pulse=0;
        TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根據(jù)T指定的參數(shù)初始化外設(shè)TIM3 OC2


        TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的預(yù)裝載寄存器

        TIM_Cmd(TIM3, ENABLE);  //使能TIM3
       


}


void TIM4_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;


        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //時鐘使能


        TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個更新事件裝入活動的自動重裝載寄存器周期的值         計數(shù)到5000為500ms
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來作為TIMx時鐘頻率除數(shù)的預(yù)分頻值  10Khz的計數(shù)頻率  
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時鐘分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數(shù)模式
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時間基數(shù)單位

        TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM4中斷,允許更新中斷


        NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  //TIM3中斷
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占優(yōu)先級0級
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  //從優(yōu)先級3級
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)NVIC寄存器


        TIM_Cmd(TIM4, ENABLE);  //使能TIMx外設(shè)
                                                         
}
void PWM_SetCompare1(uint16_t Compare)
{
        TIM_SetCompare1(TIM2, Compare);
}





回復(fù)

使用道具 舉報

ID:883242 發(fā)表于 2023-12-13 09:41 | 顯示全部樓層
沒接光敏傳感器。
回復(fù)

使用道具 舉報

ID:895440 發(fā)表于 2023-12-13 09:52 | 顯示全部樓層
跑不起來的現(xiàn)象是什么?是編譯不通過還是不會自動調(diào)整
回復(fù)

使用道具 舉報

ID:94031 發(fā)表于 2023-12-13 10:24 | 顯示全部樓層
這和光敏電阻特性有關(guān),自己要根據(jù)實際光敏電阻特性修改一下程序。
回復(fù)

使用道具 舉報

ID:958310 發(fā)表于 2023-12-13 11:16 | 顯示全部樓層
把ADC值打印出來看跑到哪個步驟。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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