钻石会员
主题
回帖0
积分10333
阅读权限50
注册时间2012-3-12
最后登录1970-1-1
在线时间 小时
|
想弄个转速测量的东东,问下如何利用atmega16来测量两路转速
精度能有多少,看了很多的转速测量
测频,测周,还有等精度
不知道谁弄过没有,交流下
单片机是atmega16的
下面是我的程序
////liuchengliaaa 20120327 PWM实验
//内部RC振荡2MHZ 6 CK + 65 ms CKSEL=0010 SUT=10
//内部RC振荡8MHZ 6 CK + 65 ms CKSEL=0100 SUT=10 on used
#include <global.h>
#include <12232.h>
//调试器用
const prog_uchar my_char_1[]={"转速: "};
const prog_uchar my_char_2[]={"占空比: %"};
//extern updata;
int main(void)
{
uchar a;
PORTA =0xFF; //不用的管脚使能内部上拉电阻
PORTC =0xFF;
DDRB=0XFF; //输出
PORTD =~((1<<PWM_1A)|(1<<PWM_1B)); //低电平,灯灭
//timer0_init();
timer1_init();
//timer2_init();
//INT0_init();
lcd12232_init();
Lcd_In_Out=0xff;
send_command(0x01);
send_command(DDRAM_addr); //设定地址
for(a=0;a<11;a++)
{
send_data(pgm_read_byte(&my_char_1[a]));
delay_ms(5);
}
send_command(DDRAM_addr+16); //第二行
for(a=0;a<13;a++)
{
send_data(pgm_read_byte(&my_char_2[a]));
delay_ms(5);
}
sei();
while (1)
{
if(updata==1) //注意这里要把updata 设定为voltalie的变量,否则不能在主程序中改变
{
//cli();
calculate_zhuansu();
//zhuansu=3401/T_zhuansu; //k=7372800/1024=7200 时钟7.3728m 分频1024
//7200*60/127=3401.57 转子齿数 127
//转速最高值 fosc*60/CHI*T_zhuansu*N @8M T_zhuansu=1 CHI=127 N=1024
//zhuansu=3690.944
//zhuansu=468750/(T_zhuansu*127); //调试 齿数1个齿
//if(INT0_T0_count>10)zhuansu=0;
//temp=OCR1A*25;
//pulse_width=temp/256; // 1024 为 10位PWM计数TOP值
pulse_width=OCR1B*25/256; //pulse_width 为占空比 100/1024=25/256
display_5(3,zhuansu);
display_2(6,ICP_flag); //调试
//display_5(3,ICP_count);
display_2(20,pulse_width);
updata=0;
//PORTB^=1<<LED;
//sei();
}
}
}
//中断函数
//定时器1捕获中断,外部中断0,定时器1溢出中断,定时器0溢出中断
SIGNAL(SIG_INPUT_CAPTURE1) //定时器1输入捕获中断
{
if(calculated_flag==0)
{
if(ICP_flag==0)
{
//TIMSK=1<<TOIE1; //使能定时器1溢出中断
//sei();
ICP_value=ICR1; //读取当前捕获值
//cycle=ICP_T1_count*TOP+ICP_value-ICP_lastValue;
ICP_T1_count=0;
ICP_flag=1;
//cli();
//TIMSK|=(1<<TICIE1)|(1<<TOIE0)|(1<<TOIE1);
//TIFR=1<<ICF1; //如果要测量脉冲宽度,则要尽快清除标志位 设定为上升沿触发
//TCCR1B|=1<<ICES1;//下降沿触发
}
else
{
ICP_flag=0;
ICP_lastValue=ICR1;
ICP_count=ICP_T1_count;
calculated_flag=1; //没有计算转速
}
}
}
//最大计时时间8.192ms 如果超过,则计数不准
//也就是最小转速为 57转/分
SIGNAL(SIG_OVERFLOW1) //定时器1溢出中断
{
ICP_T1_count++;
time_count10ms++;//8ms
updata=1;
if(time_count10ms>=100) //800ms
{
//updata=1;
time_count10ms=0;
OCR1B+=1;
OCR1A+=10;
if(OCR1B>1023)OCR1B=1;
if(OCR1A>1000)OCR1A=1;
}
if(ICP_T1_count>=63)
{
ICP_T1_count=0; //量程设定
ICP_flag=0; //超出范围重新计数
zhuansu=0; //如果转速小于最小值,回零
}
}
在这个程序中
有时12232显示的转速值会不正常,很大
一直查不到原因,有哪位大侠能指导下,谢谢 |
|