熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2024-3-13 11:43
正文摘要:adc采集與pwm程序單獨(dú)使用的時(shí)候都是可以的,但是兩個(gè)聯(lián)立起來,就是adc采集后數(shù)據(jù)處理然后重新給定占空比計(jì)數(shù)值,但是確輸出不了pwm波,不知道是哪里的問題,用的mcu是stc8h系列單片機(jī),我單獨(dú)讀取adc給定一個(gè)固定 ... |
void Init_adc() { P1M0 = 0x00; P1M1 = 0x08; P_SW2|=0X80; ADCTIM=0X3f; //2C P_SW2&=0X7F; ADCCFG=0X0f; ADC_CONTR = 0x83; //p1.3ͨµÀ _nop_(); _nop_(); EA=1; EADC=1; ADC_RES=0; ADC_CONTR |= 0x40; } void main() { float Vout=0; float Vout_D=0; float V1=0,V2=0,V3=0; float Vp=4.2057; //4.2057 float D=0.15; float Kp=0.2,Ki=0.005; Init_adc(); PWM_Init(); while(1) { ADC_CONTR |= 0x40; _nop_(); _nop_(); while(!(ADC_CONTR&0x20)); ADC_CONTR &= ~0x20; voltage2 = ADC_RES;//((unsigned int)ADC_RES<<8)+ADC_RESL; Vout = voltage2*5/255; //Vout_D = voltage1*5/255; V1 = Vp-Vout; //V3+=V1; D = D + Kp*(V1-V2) + Ki*V1; V2=V1; if(D < 0 ) //|| Vout_D > 1.826*1.1) { D=0.0; } if(D > 0.45) { D=0.48; } pwm_value = D*120; PWMB_CCR7H = 0; PWMB_CCR7L = (unsigned char)(pwm_value); soft_delay(2); } } |
STC莊偉 發(fā)表于 2024-3-13 13:44 已經(jīng)關(guān)了,如果直接用ad采樣的電壓值來改變占空比可以的,但是加了那個(gè)pid之后啊他會(huì)整天在最高占空比,改變電壓,占空比不變的。 |
排查一下ADC相關(guān)的代碼里面有沒有把擴(kuò)展寄存器訪問使能關(guān)閉了。 |
Powered by 單片機(jī)教程網(wǎng)