⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 消抖动的电机控制.txt

📁 ATmega16 加L298 控制电机
💻 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 + -