文号
865504
阅读
12661
回复
1
收藏
2
无聊做一个无刷电机调试器
2019/10/30
原创
IP:天津

用N年前的 avr Mega16A单片机开发板做了一个无刷电机调试器

IMG_20191030_225932.jpg

IMG_20191030_225911.jpg


无刷视频.mp4  点击下载

#include"iom16v.h"

#include"macros.h"

#define u8 unsigned char

#define u16 unsigned int

//8MHz晶振

 u8  disbuf[4]={1,2,3,4};

 u8  disbit[4]  ={ 0xFE, 0xFD,0xFB,0xF7}; //选通值   

 u8  discode[10]={ 0xC0, 0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };  //段码表

 //u8  str[]={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xFF };//段码表

 u8  str1[]={0x0e,0x0d,0x0b,0x07};

 u16 data1;//电压转换度数值

 u8 ADC_num_L;

 u8 ADC_num_H;

//************************************************** 

void delay_ms(u16 ms)

{

 u16 i,j;

 for(i=0;i<550;i++)

   for(j=0;j<ms;j++)

      ;

} 

//**************************************************  

void Display(void)

  {  

u8 i;

      for(i=0;i<4;i++)

        {

   PORTB=discode[disbuf[i]];

           PORTA=disbit[i];

           delay_ms(5);

           PORTA=0xff;

} 

  }



//**************************************************

void port_init(void)

{

 DDRB  =0xff;

 PORTB =0xff;

 DDRD  =0xff;

 PORTD =0xff;

 DDRA  =0x0f;

}

//**************************************************

void tim0(void)

{

 TCNT0=0x00;

 OCR0=0xfe;

 TCCR0|=BIT(3)|BIT(2);//256分频,普通模式不与OC口相连,做普通端口BIT(5)|BIT(0)BIT(7)|BIT(4)|

}


//**************************************************

void tim1_pwm(u16 data)//输出PWM

{

 u16 dataL,dataH,i;

 i=(u16)((data*2.778)+500);

 dataH=(u8)(i/256);

 dataL=(u8)(i%256);

 TCNT1H=0x00;

 TCNT1L=0x00;

 OCR1AH=dataH;//TOP值50Hz,0x03e8:2ms,0x01f4:1ms0x01

 OCR1AL=dataL;//0xf4

 OCR1BH=0x03;//TOP值50Hz,0x03e8:2ms,0x01f4:1ms

 OCR1BL=0xe8;

 ICR1H=0x27;//TOP值50Hz

 ICR1L=0x10;

 TCCR1A|=BIT(7)|BIT(5)|BIT(4)|BIT(1);//相位修正8模式

 TCCR1B|=BIT(4)|BIT(1);//8分频

}

//*************************************************

void ADC_init(void)

{

u16 i,j;

//SFIOR|=BIT(6)|BIT(5);//自动触发源选择,连续转换模式

ADMUX|=BIT(6)|BIT(2)|BIT(1)|BIT(0);//基准源5V电源AVCC,输入通道ADC7

ADCSRA|=BIT(7);//自动触发使能位5|BIT(5)



}

//**************************************************

void numble(u16 data)

{

u8 i,k;

//i=(u8)((data-500)*0.36);//ADC值转换度数0--180,只为测试用

i=data;

k=i/100;

PORTB=discode[k];//

PORTA=0xfd;

delay_ms(5);

PORTB=0xff;

delay_ms(2);

k=i%100/10;

PORTB=discode[k];//

PORTA=0xfb;

delay_ms(5);

PORTB=0xff;

delay_ms(2);

k=i%10;

PORTB=discode[k];//

PORTA=0xf7;

delay_ms(5);

PORTB=0xff;

delay_ms(2);

}

//**************************************************

void main(void)

{

u16 i,j;

u8 dataH,dataL,k;

k=0;j=0;

port_init();

for(i=0;i<20;i++)//测试数码管用,忽略

 {

  k++;

  if(k>=4)

   {

     k=0;

     j++;

     if(j>=7)

        j=0;

   }

PORTA=str1[k];

PORTB=discode[k+j];

delay_ms(70);

PORTB=0xff;

delay_ms(30);

}

//tim0();

tim1_pwm(0);//测试用数值,忽略

ADC_init();

i=0;j=0;

while(1)

{

  ADCSRA|=BIT(6);

  data1=(ADCH*256+ADCL);

  i=(u16)((data1*0.4883)+500);

  k=(u8)(data1*0.17578);

  dataH=(u8)(i/256);

  dataL=(u8)(i%256); 

  OCR1AH=dataH;//TOP值50Hz,0x03e8:2ms,0x01f4:1ms0x01

  OCR1AL=dataL;//0xf4

  numble(k);

  delay_ms(20);



}

}

单片机P5端口接电调信号入口。

烧录的exe文件

attachment icon M_16.hex 4.99KB HEX 54次下载


1
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的