用N年前的 avr Mega16A单片机开发板做了一个无刷电机调试器
无刷视频.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文件
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |