#include <iom88v.h>
#include <macros.h>
#define SET_SP 100
unsigned char data;
unsigned int duty;
int adc_value;
int error=0;
int integral=0;
int kp=1638;
int ki=327;
long temp=0;
void delay_ms(unsigned int count)
{
unsigned int i,j;
for(i=0;i<count;i++)
{
for(j=0;j<1000;j++)
NOP();
}
}
void port_init(void)
{
PORTB=0x00;
DDRB=0xff;
PORTC=0x28;
DDRC=0x28;
}
void adc_init(void)
{
ADMUX=0x44;
ADCSRA|=((1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0));//AD初始化
}
void timer0_init(void)
{
TCCR0B|=((1<<CS02)|(1<<CS00));
TCNT0=0x63;
TIMSK0|=(1<<TOIE0);
}
void timer1_init(void)
{
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
//ICR1H=0x06;
ICR1H=0x1f;
ICR1L=0x3f;
TCCR1A=0x82;
TCCR1B=0x19;
}
#pragma interrupt_handler t0_isr:17
void t0_isr()
{
static unsigned char count=0;
TCNT0=0x63;
count++;
if(count>=50)
{
count=0;
ADCSRA|=(1<<ADSC);
}
}
#pragma interrupt_handler adc_isr:22
void adc_isr()
{
adc_value=ADCL;
adc_value|=((unsigned int)ADCH<<8);
if(adc_value>=SET_SP)
{
duty-=20;
if(duty<=200)
{
duty=200;
}
}
else
{
duty+=20;
if(duty>=1000)
{
duty=1000;
}
}
/*if(adc_value>SET_SP)
{
error=adc_value-SET_SP;
integral-=error;
temp=(long)kp*(long)error+(long)ki*(long)integral;
temp>>=15;
duty-=(unsigned int)temp;
}
else
{
error=SET_SP-adc_value;
integral+=error;
temp=(long)kp*(long)error+(long)ki*(long)integral;
temp>>=15;
duty+=(unsigned int)temp;
}*/
/*error=SET_SP-adc_value;
integral+=error;
temp=(long)kp*(long)error+(long)ki*(long)integral;
temp>>=15;
duty+=(unsigned int)temp;
if(duty>=4000)
{
duty=4000;
}*/
OCR1AH=duty/256;
OCR1AL=duty%256;
//ADCSRA|=(1<<ADSC);
}
void main(void)
{
unsigned char data_last=0x00;
CLI();
port_init();
adc_init();
timer0_init();
timer1_init();
SEI();
while(1)
{
data=(PINC&0x07);
switch(data)
{
case 0x04:PORTB|=(1<<0);
PORTB|=(1<<5);
PORTB&=~(1<<2);
PORTB&=~(1<<3);
PORTB&=~(1<<4);
PORTC&=~(1<<5);
break;
case 0x05:PORTB|=(1<<0);
PORTC|=(1<<5);
PORTB&=~(1<<2);
PORTB&=~(1<<3);
PORTB&=~(1<<4);
PORTB&=~(1<<5);
break;
case 0x01:PORTB|=(1<<2);
PORTC|=(1<<5);
PORTB&=~(1<<0);
PORTB&=~(1<<3);
PORTB&=~(1<<4);
PORTB&=~(1<<5);
break;
case 0x03:PORTB|=(1<<2);
PORTB|=(1<<4);
PORTB&=~(1<<0);
PORTB&=~(1<<3);
PORTB&=~(1<<5);
PORTC&=~(1<<5);
break;
case 0x02:PORTB|=(1<<3);
PORTB|=(1<<4);
PORTB&=~(1<<0);
PORTB&=~(1<<2);
PORTB&=~(1<<5);
PORTC&=~(1<<5);
break;
case 0x06:PORTB|=(1<<3);
PORTB|=(1<<5);
PORTB&=~(1<<0);
PORTB&=~(1<<2);
PORTB&=~(1<<4);
PORTC&=~(1<<5);
break;
}
}
}
step.rar_BLDC电机控制_bldc 仿真_bldc proteus_bldc仿真_无刷电机proteus
版权申诉
5星 · 超过95%的资源 88 浏览量
2022-07-15
21:25:00
上传
评论
收藏 113KB RAR 举报
Kinonoyomeo
- 粉丝: 74
- 资源: 1万+
评论1