pic18fxx điều khiển động cơ!
mình đang làm đề tài trên pic18f4431 để điều khiển động cơ có bạn nào đã làm mảng này làm ơn chỉ mình với!
mình đã mày mò viết thử code nhưng ko biết có đúng ko?
đây là lần đầu tiên mình tiếp cận pic nên mong các bạn chỉ giáo!
thanks!
các bạn tham khảo code nhe!
#include<18f4431.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,NODEBUG
#use delay(clock=20000000)
//#bit TBInt_pin = 0xfa4.4
FLOAT MODULATION_INDEX0,MODULATION_INDEX1;
INT16 U_DK2_DUTY;
INT8 adc,i = 0;
Void GENERATE_PWM()
{
set_power_pwm0_duty(U_DK2_DUTY);
}
Void GENERATE_PWM1()
{
set_power_pwm2_duty(U_DK2_DUTY);
}
void adc_init()
{
setup_adc_ports(SAN0);
setup_adc(adc_clock_internal);
set_adc_channel(0);
delay_ms(1000);
}
void pwm_init()
{
setup_power_pwm_pins(PWM_COMPLEMENTARY,PWM_COMPLEM ENTARY,PWM_OFF,PWM_OFF);
setup_power_pwm(PWM_CLOCK_DIV_128|PWM_UP_DOWN|PWM_ DEAD_CLOCK_DIV_16,1,0,62,0,1,0);
MODULATION_INDEX0 = 0;
MODULATION_INDEX1 = 1;
}
void chedo()
{
i=0;
while(i<80)
{
if(input(pin_C3))
{
adc = read_adc();
output_low(pin_d2);
output_high(pin_d3);
// output_low(pin_d1);
{
if(i<25)
{
U_DK2_DUTY = adc*MODULATION_INDEX0;
GENERATE_PWM();
i++;
}
if(25<=i<60)
{
U_DK2_DUTY = adc*MODULATION_INDEX1;
GENERATE_PWM();
i++;
}
if(60<=i<80)
{
U_DK2_DUTY = adc*MODULATION_INDEX0;
GENERATE_PWM();
i++;
}
// if(i == 80) {i == 0;}
}
}
if (input(pin_C4))
{
adc = read_adc();
// output_low(pin_d1);
output_low(pin_d3);
output_high(pin_d2);
//{
if(i<25)
{
U_DK2_DUTY = adc*MODULATION_INDEX0;
GENERATE_PWM1();
i++;
}
if(25<=i<60)
{
U_DK2_DUTY = adc*MODULATION_INDEX1;
GENERATE_PWM1();
i++;
}
if(60<=i<80)
{
U_DK2_DUTY = adc*MODULATION_INDEX0;
GENERATE_PWM1();
i++;
}
// if(i == 80) {i == 0;}
}
//if(i == 80) {i == 0;}
}}
void main()
{
GENERATE_PWM();
// SAN6==0;
// SAN7==0;
adc_init();
pwm_init();
while(true)
chedo();
}
|