📄 control_motor3.c
字号:
#include <16F877.h>
//#device PIC16F877 *=16 ADC=10
#include <stdlib.h>
#include <math.h>
#fuses hs, nowdt, noprotect, put, nolvp, brownout
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)
#define Kp 1.88
#define Ki 0.1
//char s[10];
int16 set_value=50;
int16 xung;
int16 error=0;
float error_p;
float error_pi;
signed int16 duty=0;
int16 error_before=0;
#int_RTCC
void samplingtime()
{
xung=get_TIMER1();
if (set_value>=xung)
{
error = set_value-xung;
printf("E=%ld ",error);
error_p = error*Kp;
error_pi = error_p + error_before*Ki;
duty += (int16)(error_pi);
duty=(duty>1023?1023:duty);
//printf("D=%ld ",duty);
}
else
{
error = xung - set_value;
printf("E=%ld ",error);
error_p = error*Kp;
error_pi = error_p + error_before*Ki;
duty -= (int16)(error_pi);
duty=(duty<60?60:duty);
printf("D=%ld ",duty);
}
set_PWM1_duty(duty);
error_before=error;
set_timer1(0);
set_timer0(60);
}
void main()
{
/*
gets(s);
Kp=atof(s);
printf("%f ",Kp);
gets(s);
Ki=atof(s);
printf("%f ",Ki);
*/
setup_TIMER_0(RTCC_INTERNAL|RTCC_DIV_256);
setup_CCP1(CCP_PWM);
setup_TIMER_2(T2_DIV_BY_1, 255, 1);
setup_TIMER_1( T1_EXTERNAL );
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
set_PWM1_duty(0);
output_high(PIN_A2);
output_high(PIN_A5);
set_timer0(60); //sampling_time = (255-60)*4*256/20000000=9.984 ms
while (1)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -