📄 消抖动的电机控制.txt
字号:
/***************************************************
×××PB3为OC0“PMW“输出角,不能用其他角××××
Project :dianjiqudong
Version :
Date : 2008-8-2
Author : Freeware, for evaluation and non-commercial use only
Company :
Comments:
Chip type : ATmega16
Program type : Application
Clock frequency : 4.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#include <delay.h>
flash unsigned char speed[7]={2,50,98,148,190,220,255};
flash unsigned char direction[4]={0x02,0x00,0x01,0x00};
unsigned char counter;
unsigned char i;
bit key_stime_ok;
#define key_input PINC // 按键输入口
#define key_mask 0b00000111 // 按键输入判断码
#define key_no 0
#define key_k1 1
#define key_k2 2
#define key_k3 3
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
unsigned char read_key(void)
{
static unsigned char key_state = 0,key_press;
unsigned char key_return = key_no;
key_press = key_input & key_mask; // 读按键I/O电平
switch (key_state)
{
case key_state_0: // 按键初始态
if (key_press != key_mask) key_state = key_state_1;
break; // 键被按下,状态转换到键确认态
case key_state_1: // 按键确认态
if (key_press == (key_input & key_mask))
{
if (key_press == 0b00000110) key_return = key_k1;
else if (key_press == 0b00000101) key_return = key_k2;
else if(key_press == 0b00000011) key_return = key_k3;
key_state = key_state_2; // 状态转换到键释放态
}
else
key_state = key_state_0; // 按键已抬起,转换到按键初始态
break;
case key_state_2:
if (key_press == key_mask) key_state = key_state_0;
break; //按键已释放,转换到按键初始态
}
return key_return;
}
void main(void)
{
unsigned char key_temp;
PORTC=0x0f;
DDRC=0x00;
PORTA=0x00;
DDRA=0x03; //电机方向控制
DDRB=0x08; //电机速度控制
TCCR0=0x69; //定义一分频和OCO置位 CTC模式
counter=0;
i=0;
while (1)
{
delay_ms(15);
key_stime_ok = 1;
if (key_stime_ok) // 10ms到,键处理
{
key_stime_ok = 0;
key_temp = read_key(); // 调用按键接口程序
if (key_temp) // 确认有键按下
{
if (key_temp == key_k1) // K1键按下,加速
{
if(++counter>=7)counter=0;
}
}
if (key_temp == key_k2) // K2键按下,减速
{
if(counter)--counter;
else counter=6;
}
if (key_temp == key_k3) // K3键按下,改变方向
{
if(++i>=4)i=0;
}
}
PORTA=direction[i]; //改变电机方向
OCR0=speed[counter];//改变电机速度
};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -