|
用的是stc8g1k08a單片機(jī)芯片,用adc把0-5v的模擬信號(hào)轉(zhuǎn)成pwm輸出,占空比小于10%的時(shí)候會(huì)有點(diǎn)輕微的閃爍我就在占空比小于10%的時(shí)候把它關(guān)掉,但是在那個(gè)臨界的時(shí)候led會(huì)一直閃是為什么呀,我后面測(cè)了led閃爍時(shí)的電壓,它一直在九點(diǎn)多v到十點(diǎn)多v變化,是adc的精度不夠嗎還是什么原因呀,代碼是之前一位工程師寫的,但是他離職了,總工就扔給我一個(gè)菜雞了 
#include "intrins.h"
#include "main.h"
#include "Adc.h"
#define CYCLE 0x1000
AboutPwmPara PwmPara; //PWM相關(guān)參數(shù)
void delay_us(int n)
{
while (--n);
}
void delay()
{
int i, j;
for (i=0; i<10; i++)
for (j=0; j<1; j++);
}
/*******************************************************************************
** 函數(shù)名稱: Main_Init()
** 函數(shù)功能: 參數(shù)初始化
** 函數(shù)參數(shù):
**
**
** 返 回 值: 無
*******************************************************************************/
void Main()
{
P3M0 = 0x00;
P3M1 = 0x00;
PwmPara.PwmCnt = 0; //Pwm占空比計(jì)數(shù)器
PwmPara.PwmPercentage = 0;
PwmPara.PwmLast = 0;
TMOD = 0x00;
TL0 = 0xa3; //65536-11.0592M/12/1000
TH0 = 0xff;
TR0 = 1; //啟動(dòng)定時(shí)器
ET0 = 1; //使能定時(shí)器中斷
Adc_Init();
EADC = 1; //開啟ADC中斷
EA = 1;
while(1)
{
PwmPara.PwmNow = AdcPara.AdcVal/1024*100;
if(PwmPara.PwmLast == 0)
PwmPara.PwmLast = PwmPara.PwmNow;
PwmPara.PwmLast = PwmPara.PwmLast*0.8f+PwmPara.PwmNow*0.2f;
PwmPara.PwmPercentage = (uint8_t)(PwmPara.PwmLast+0.5f);
}
}
/*******************************************************************************
** 函數(shù)名稱: Time0()
** 函數(shù)功能: 定時(shí)器0中斷處理函數(shù)
** 函數(shù)參數(shù):
**
**
** 返 回 值: 無
*******************************************************************************/
void TM0_Isr() interrupt 1
{
if(PwmPara.PwmCnt>100)
PwmPara.PwmCnt = 0;
PwmPara.PwmCnt++;
if(PwmPara.PwmPercentage <10)
{
PwmPara.PwmPercentage = 0;
P32 = 0;
}
if((PwmPara.PwmCnt>0)&&(PwmPara.PwmCnt < PwmPara.PwmPercentage))
{
if(P32 == 0)
P32 = 1;
}
else
{
if(P32 == 1)
P32 = 0;
}
}
adc文件
AboutAdcContrVal AdcContrVal; //控制寄存器參數(shù)
AboutAdcCfgVal AdcCfgVal; //配置寄存器參數(shù)
AboutAdcTimVal AdcTimVal; //時(shí)序寄存器
AboutAdcPara AdcPara; //ADC相關(guān)參數(shù)
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/*******************************************************************************
** 函數(shù)名稱: Adc_Init()
** 函數(shù)功能: 初始化
** 函數(shù)參數(shù):
**
**
** 返 回 值: 無
*******************************************************************************/
void Adc_Init(void)
{
AdcContrVal.AllVal = 0;
AdcCfgVal.AllVal = 0;
// AdcTimVal.AllVal = 0;
AdcPara.ConvertCnt = 0; //連續(xù)轉(zhuǎn)換次數(shù)計(jì)數(shù)器
AdcPara.AdcVal = 0; //ADC轉(zhuǎn)換值
AdcContrVal.ControlPara.Adc_Power = 1; //打開ADC電源
AdcContrVal.ControlPara.Adc_Chs = ADC_CHS_P55; //選擇ADC引腳
AdcContrVal.ControlPara.Adc_Start = 1; //開啟ADC轉(zhuǎn)換
AdcCfgVal.ControlPara.Speed = 0x0f; //將ADC系統(tǒng)時(shí)鐘設(shè)定為SYSclk/2/16
AdcCfgVal.ControlPara.Resfmt = 1; //將ADC轉(zhuǎn)換結(jié)果右對(duì)齊
// ADCTIM = AdcTimVal.AllVal; //設(shè)置 ADC 內(nèi)部時(shí)序
ADCCFG = AdcCfgVal.AllVal; //寄存器賦值
ADC_CONTR = AdcContrVal.AllVal; //寄存器賦值
}
/*******************************************************************************
** 函數(shù)名稱: Adc_Isr()
** 函數(shù)功能: ADC轉(zhuǎn)換中斷處理函數(shù)
** 函數(shù)參數(shù):
**
**
** 返 回 值: 無
*******************************************************************************/
void Adc_Isr() interrupt 5
{
if(AdcPara.ConvertCnt >= CONVERT_TIMES)
{
AdcPara.ConvertCnt = 0;
AdcPara.SunVal = 0; //ADC轉(zhuǎn)換值
for(AdcPara.Temp=0;AdcPara.Temp<CONVERT_TIMES;AdcPara.Temp++)
{
AdcPara.SunVal += AdcPara.ConvertVal[AdcPara.Temp];
AdcPara.ConvertVal[AdcPara.Temp] = 0;
}
if(AdcPara.SunVal != 0)
AdcPara.AdcVal = AdcPara.SunVal/CONVERT_TIMES;
else
AdcPara.AdcVal = 0;
}
AdcPara.ConvertVal[AdcPara.ConvertCnt] = ADC_RES*256 + ADC_RESL;
AdcPara.ConvertCnt++;
AdcContrVal.ControlPara.Adc_Flag = 0; //中斷標(biāo)志位清0
AdcContrVal.ControlPara.Adc_Start = 1; //開啟ADC轉(zhuǎn)換
ADC_CONTR = AdcContrVal.AllVal; //寄存器賦值
} |
-
-
Adjust.rar
2024-6-14 09:33 上傳
點(diǎn)擊文件名下載附件
66.27 KB, 下載次數(shù): 3
|