Martin Nikiforov
18. June 2013 - 11:08
Permalink
#include "d:\shemi\levitator 16f886\levitator886.h" #include "STDLIB.H" int pos_i=0; int Kp=7,Ki=1,Kd=1; int16 potenciometer; int16 set_position=750; int16 position; signed int16 PWM_d=100; signed int16 error_now; signed int16 error_last=0; signed int16 integral_error=0; signed int16 iMAX=50,iMIN=-50; signed int16 differential_error=0; signed int16 dMAX=10,dMIN=-10; void settings(); #int_EXT void EXT_isr(void) { //delay_us(100); if(!input(Pin_b0)){ // setup_timer_2(T2_DIV_BY_1,255,1); //16khz
set_position=position; output_toggle(PIN_b3); } return; }
#int_AD void AD_isr(void) { //pos_i++; //if(pos_i==5)pos_i=1; position=read_adc(ADC_READ_ONLY); return; }
#int_RDA void RDA_isr(void) {
}
void main() { // setup_oscillator(OSC_8MHZ); delay_ms(100); setup_adc_ports(sAN0|sAN1|sAN2|VSS_VREF); setup_adc(ADC_CLOCK_DIV_8); setup_spi(SPI_SS_DISABLED); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_timer_2(T2_DIV_BY_1,255,1); // ~16khz setup_ccp1(CCP_PWM|CCP_PWM_HALF_BRIDGE|CCP_PWM_H_H| CCP_SHUTDOWN_ON_INT0|CCP_SHUTDOWN_AC_L|CCP_SHUTDOWN_BD_L); setup_ccp2(CCP_PWM); set_pwm1_duty(500); set_pwm2_duty(800); delay_ms(1000); port_b_pullups (TRUE); setup_comparator(NC_NC_NC_NC); delay_ms(200); // enable_interrupts(INT_EXT); enable_interrupts(INT_AD); delay_ms(200); enable_interrupts(GLOBAL);
int i; int8 analog_input=1; // 0-potentiometer 1-hall set_adc_channel(analog_input); delay_us(30);
// settings(); while(true){ output_toggle(PIN_B5); //if (analog_input==0) {potenciometer = read_adc()/2;analog_input++;} // position[0]=0; // for( i=1;i<5;i++){ // position[0]+=Position[i]; // } // position[0]=position[0]/4; // set_adc_channel(analog_input);
//printf("%4Ld %4Ld %4Ld \r\n",error_now,position,PWM_d); //delay_ms(20); error_now=position-set_position;
//if(error_now>(error_last+dMAX))error_now=error_last+dMAX; //if(error_now<(error_last-dMIN))error_now=error_last-dMIN;
// integral_error+=(error_now/4); // if(integral_error>iMAX)integral_error=iMAX; // if(integral_errordMAX)differential_error=dMAX; //if(differential_error1000)PWM_d=1000;
// setup_ccp1(CCP_PWM|CCP_PWM_HALF_BRIDGE|CCP_PWM_H_H| //CCP_SHUTDOWN_ON_INT0|CCP_SHUTDOWN_AC_L|CCP_SHUTDOWN_BD_L); //set_pwm1_duty(position[0]);// debug na pwm set_pwm1_duty(PWM_d); // debug na pwm read_adc(ADC_START_ONLY); delay_ms(1); error_last=error_now;
// delay_ms(250); }
} void settings(){ char setting_string[20]=""; char *ptr; long timeout; timeout=0; //printf("settings?\n\r"); //stop if there is no terminal while(!kbhit()&&(++timeout<50000)) delay_us(100); if(!kbhit()) { printf("set_position=%Lu Kp=%u Ki=%u Kd=%u \r\n",set_position,Kp,Ki,Kd); // for kp kd float - printf("set_position=%Lu Kp=%g Ki=%g Kd=%g \r\n", //set_position,Kp,Ki,Kd); delay_ms(2000); return; } gets(setting_string); printf(setting_string); setting_string="";
printf("set_position:"); gets(setting_string); set_position=strtoul(setting_string,&ptr,10); printf(setting_string);
printf("Kp:"); gets(setting_string); Kp=strtof(setting_string,&ptr); printf(setting_string);
printf("Ki:"); gets(setting_string); Ki=strtof(setting_string,&ptr); printf(setting_string);
printf("Kd:"); gets(setting_string); Kd=strtof(setting_string,&ptr); printf(setting_string); printf("set_position=%Lu Kp=%u Ki=%u Kd=%u \r\n",set_position,Kp,Ki,Kd); //for float parameter - printf("set_position=%Lu Kp=%g Ki=%g Kd=%g // \r\n",set_position,Kp,Ki,Kd); delay_ms(2000); }
More information about text formats
Electromagnetic levitation
#include "d:\shemi\levitator 16f886\levitator886.h"
#include "STDLIB.H"
int pos_i=0;
int Kp=7,Ki=1,Kd=1;
int16 potenciometer;
int16 set_position=750;
int16 position;
signed int16 PWM_d=100;
signed int16 error_now;
signed int16 error_last=0;
signed int16 integral_error=0;
signed int16 iMAX=50,iMIN=-50;
signed int16 differential_error=0;
signed int16 dMAX=10,dMIN=-10;
void settings();
#int_EXT
void EXT_isr(void)
{
//delay_us(100);
if(!input(Pin_b0)){
// setup_timer_2(T2_DIV_BY_1,255,1); //16khz
set_position=position;
output_toggle(PIN_b3);
}
return;
}
#int_AD
void AD_isr(void)
{
//pos_i++;
//if(pos_i==5)pos_i=1;
position=read_adc(ADC_READ_ONLY);
return;
}
#int_RDA
void RDA_isr(void)
{
}
void main()
{
// setup_oscillator(OSC_8MHZ);
delay_ms(100);
setup_adc_ports(sAN0|sAN1|sAN2|VSS_VREF);
setup_adc(ADC_CLOCK_DIV_8);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_timer_2(T2_DIV_BY_1,255,1); // ~16khz
setup_ccp1(CCP_PWM|CCP_PWM_HALF_BRIDGE|CCP_PWM_H_H|
CCP_SHUTDOWN_ON_INT0|CCP_SHUTDOWN_AC_L|CCP_SHUTDOWN_BD_L);
setup_ccp2(CCP_PWM);
set_pwm1_duty(500);
set_pwm2_duty(800);
delay_ms(1000);
port_b_pullups (TRUE);
setup_comparator(NC_NC_NC_NC);
delay_ms(200);
// enable_interrupts(INT_EXT);
enable_interrupts(INT_AD);
delay_ms(200);
enable_interrupts(GLOBAL);
int i;
int8 analog_input=1; // 0-potentiometer 1-hall
set_adc_channel(analog_input);
delay_us(30);
// settings();
while(true){
output_toggle(PIN_B5);
//if (analog_input==0) {potenciometer = read_adc()/2;analog_input++;}
// position[0]=0;
// for( i=1;i<5;i++){
// position[0]+=Position[i];
// }
// position[0]=position[0]/4;
// set_adc_channel(analog_input);
//printf("%4Ld %4Ld %4Ld \r\n",error_now,position,PWM_d);
//delay_ms(20);
error_now=position-set_position;
//if(error_now>(error_last+dMAX))error_now=error_last+dMAX;
//if(error_now<(error_last-dMIN))error_now=error_last-dMIN;
// integral_error+=(error_now/4);
// if(integral_error>iMAX)integral_error=iMAX;
// if(integral_errordMAX)differential_error=dMAX;
//if(differential_error1000)PWM_d=1000;
// setup_ccp1(CCP_PWM|CCP_PWM_HALF_BRIDGE|CCP_PWM_H_H|
//CCP_SHUTDOWN_ON_INT0|CCP_SHUTDOWN_AC_L|CCP_SHUTDOWN_BD_L);
//set_pwm1_duty(position[0]);// debug na pwm
set_pwm1_duty(PWM_d); // debug na pwm
read_adc(ADC_START_ONLY);
delay_ms(1);
error_last=error_now;
// delay_ms(250);
}
}
void settings(){
char setting_string[20]="";
char *ptr;
long timeout;
timeout=0;
//printf("settings?\n\r"); //stop if there is no terminal
while(!kbhit()&&(++timeout<50000)) delay_us(100);
if(!kbhit()) {
printf("set_position=%Lu Kp=%u Ki=%u Kd=%u \r\n",set_position,Kp,Ki,Kd);
// for kp kd float - printf("set_position=%Lu Kp=%g Ki=%g Kd=%g \r\n",
//set_position,Kp,Ki,Kd);
delay_ms(2000);
return;
}
gets(setting_string);
printf(setting_string);
setting_string="";
printf("set_position:");
gets(setting_string);
set_position=strtoul(setting_string,&ptr,10);
printf(setting_string);
printf("Kp:");
gets(setting_string);
Kp=strtof(setting_string,&ptr);
printf(setting_string);
printf("Ki:");
gets(setting_string);
Ki=strtof(setting_string,&ptr);
printf(setting_string);
printf("Kd:");
gets(setting_string);
Kd=strtof(setting_string,&ptr);
printf(setting_string);
printf("set_position=%Lu Kp=%u Ki=%u Kd=%u \r\n",set_position,Kp,Ki,Kd);
//for float parameter - printf("set_position=%Lu Kp=%g Ki=%g Kd=%g
// \r\n",set_position,Kp,Ki,Kd);
delay_ms(2000);
}