|
發布時間: 2018-11-25 12:55
正文摘要:主控選用STC15f2k16s2,制作數控電源,輸出兩路pwm,控制TL494分別調節電壓和電流。pwm脈寬通過ec11編碼器調整,切換使用編碼器的按鍵。怎奈偶是菜鳥,程序變成了一鍋粥,搞不定啦,求高人指導一下程序吧。 ... |
Y_G_G 發表于 2018-11-27 10:38 大佬,你也沒把電路貼出來參考一下啊。 |
|
每周只有周末有時間弄弄,12月2日的進度 編碼器和PWM抄了一段程序,各種編譯錯誤請各位高人指點指點。 1、編碼器函數,Encoder_EC11_Scan() 是判斷編碼器旋轉方向,EC11_Key_Scan()是判斷編碼器按鍵狀態 //----------------EC11 編碼器掃描函數----------------// char Encoder_EC11_Scan() /* 這里只是部分代碼 */ { char ScanResult = 0; //返回編碼器掃描結果,用于分析編碼器的動作 //返回值的取值: 0:無動作; 1:正轉; -1:反轉; if(EC11_A_Now != EC11_A_Last) //以A為時鐘,B為數據。正轉時AB反相,反轉時AB同相 { if(EC11_A_Now == 0) { if(EC11_B_Now ==1) //只需要采集A的上升沿或下降沿的任意一個狀態,若A下降沿時B為1,正轉 ScanResult = 1; //正轉 else //反轉 ScanResult = -1; } EC11_A_Last = EC11_A_Now; //更新編碼器上一個狀態暫存變量 EC11_B_Last = EC11_B_Now; //更新編碼器上一個狀態暫存變量 } return ScanResult; //返回值的取值: 0:無動作; 1:正轉; -1:反轉; } //----------------EC11 按鍵掃描函數----------------// int EC11_Key_Scan() { unsigned int i = 0; if(EC11_Key == 1 && i == 0) { delay_ms(1); if(EC11_Key == 1) { i = 1; } } /* else if(EC11_Key == 1 && i == 1) { delay_ms(1); if(EC11_Key == 1) { i = 2; } } else if(EC11_Key == 1 && i == 2) { delay_ms(1); if(EC11_Key == 1) { i = 3; } } */ else { i = 0; } return i; } 2、PWM pwm_init(void) 是初始化,pwm_set0(unsigned int x) pwm_set1(unsigned int x) 為設置兩個通道的占空比 //----------------PWM初始化函數----------------// void pwm_init(void) //PWM初始化函數,初始占空比為0 { CMOD=0x02; //0000 0010 空閑時不計數,不產生中斷,時鐘源為fosc/2,因此輸出占用率為fosc/512 CL=0x00; CH=0x00; AUXR1 = 0x10; //切換IO口 CCAPM0=0x42; //0100 0010, 8位 PWM CCAPM1=0x42; //0100 0010, 8位 PWM CCAP0L=0x00; CCAP0H=0x00; //PWM實現方法,因為是8位,CL基礎計數器從0xFF遞減到0x00,溢出后將CCAP0H //的值加載到CCAP0L,若CL遞減過程中,若大于CCAP0L,則輸出高電平,否則為低電平 CCAP1L=0x00; CCAP1H=0x00; CR=1; //開啟PCA計數器 } void pwm_set0(unsigned int x) //占空比設置函數 { if(x>255) x=255 ; if(x<10) x=10 ; CCAP0H=x; //設置比較值 CCAP0L=x; } void pwm_set1(unsigned int x) //占空比設置函數 { if(x>255) x=255 ; if(x<5) x=5 ; CCAP1H=x; //設置比較值 CCAP1L=x; } 3、主函數這里一堆錯誤, if EC11_Key_Scan()==1 判斷按鍵未按下,為電壓調節模式 { if Encoder_EC11_Scan()==1 編碼器正傳 { pwm_0=pwm_0++; pwm_set0(pwm_0); 占空比增大 } if Encoder_EC11_Scan()==-1 編碼器反傳 { pwm_0=pwm_0--; pwm_set0(pwm_0); 占空比減小 } } if EC11_Key_Scan()==0 按鍵按下,為電流調節模式 { if Encoder_EC11_Scan()==1 {pwm_1=pwm_1++; pwm_set1(pwm_1); } if Encoder_EC11_Scan()==-1 { pwm_1=pwm_1--; pwm_set1(pwm_1); } } 4、一堆錯誤 MAIN.C(212): error C141: syntax error near 'EC11_Key_Scan', expected '(' MAIN.C(213): error C141: syntax error near '{' MAIN.C(215): error C141: syntax error near '{' MAIN.C(218): error C141: syntax error near 'Encoder_EC11_Scan', expected '(' MAIN.C(219): error C141: syntax error near '{' MAIN.C(223): error C141: syntax error near 'EC11_Key_Scan', expected '(' MAIN.C(224): error C141: syntax error near '{' MAIN.C(225): error C141: syntax error near '{' MAIN.C(228): error C141: syntax error near 'Encoder_EC11_Scan', expected '(' MAIN.C(229): error C141: syntax error near '{' |
|
你這數控電源精度上基本沒有保證的,能50mV的精度就很好了。 用我的方案吧,我的板子打樣還沒有回來,這個是改動好幾次的版本了,輸出電流6A,輸入電壓12V,步進可調的精度±5mV,溫度漂移取決于TL431 單片機用STC8系列的,它有個12位的ADC是目前STC中ADC最高精度的單片機之一。另外,還可以增加反饋線,輸出4.20V電壓,5.5A電流,電壓下降0.02V,也就是輸出4.18V,參數基本上是工業級 但是,電流的轉換還沒有搞定,因為還沒有找到好的取樣電阻。 至于你的程序,首先要把顯示和編碼開關搞好,一步一步來,先寫一個可以轉動編碼開關,一個變量跟著增加,然后在顯示出來,至于計算,留在后面慢慢來 自下而上,一個一個的小功能寫好,要不一下寫完整個程序,這樣會很亂的。 編碼開關用中斷,1mS或者2mS一次掃描就可以了,這樣不影響顯示。 |
| 有人來嗎? |