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

📄 main.c

📁 基于ARM7的直流电机的驱动,还有FLASH驱动,LCD驱动等
💻 C
字号:
// ARM Linker 选项:
// -info totals -ro-base 0x0C084000 -first Init.o(Init)
//
#include "defs.h"
#include "44b0x.h"
#include <avt.h>
#include <avtintl.h>
#include <string.h>


//void	LcdMain(void *args);
//void 	GreenMain(void *args);

// 清看门狗
void
clrwtd(void) {
    rPDATE ^= 1 << 3;//异或 
//    rPDATC ^= 1 << 2;      //电机离合器闭合

    
}

// 串口命令接收任务
void GetPkt(void *args) 
{
	// 数据报格式
	// |-------------------
	// |H|F| len | data |C| 
	// |-------------------
	// H: 帧头('H')
	// F: 功能码(0x66为对钟)
	// len: 数据长度
	// data: 报文数据字段
	// C: 累加和校验
	while(1)
	{
		if(getkey() == 'H')
		{
			if(getkey() == 0x66)
			{
				bsp_puts("收到对钟命令!\n");
			}
		}
    	tm_delay(50);		
	}
}

/****************************************************************************
【功能说明】ADC某一通道进行转换,返回转换的数据
****************************************************************************/
unsigned short Read_Adc(unsigned char ch)
{
	int i;
    static int prevCh=-1;

    if(prevCh!=ch)
    {
		rADCCON = 0x1|(ch<<2);		//设置AD转换通道
   		for(i=0;i<150;i++);		//最小15uS
	}
	
    rADCCON=0x1|(ch<<2);	//开始AD转换
	while(rADCCON & 0x1);	//避免标志FLAG错误
    while(!(rADCCON & 0x40));		//等待AD转换结束
	for(i = 0; i < rADCPSR; i++);		//避免第二次标志FLAG错误
    prevCh=ch;
	return rADCDAT;		//返回AD转换值
}
//***************************************************************************


void LeftDone(int vol) 
{

     rPDATC |= 1;            //MC33883 GN控制置高,关闭输出        
	 
	 rTCON &= ~(1 << 20);    //关PWM4    	 
     rTCNTB4=2000;
     rTCMPB4=vol;
     rTCON|= 1 << 23;
     rTCON &= ~(1 << 22);   
     rTCON|= 1 << 21;        /*手工装载定时器的计数值*/
     rTCON &= ~(1 << 21);
     rTCON|= 1 << 20;        //开PWM4
     rTCON &= ~(1 << 21);
     
     rPDATC &= ~1;          //MC33883 GN控制低,打开输出
     rPDATC |= 1 << 2;      //电机离合器闭合
        
	}

void RightDone(int vol) 
{

     rPDATC |= 1;          //MC33883 GN控制置高,关闭输出 
         
     rTCON &= ~(1 << 8);   //关PWM1
     rTCNTB1=2000;
     rTCMPB1=vol;          //设置占空比
     rTCON|= 1 << 11;
     rTCON &= ~(1 << 10);   
     rTCON|= 1 << 9;       /*手工装载定时器的计数值*/
     rTCON &= ~(1 << 9);     
     rTCON|= 1 << 8;       //开PWM1 
     rTCON &= ~(1 << 9);
     
     rPDATC &= ~1;          //MC33883 GN控制低,打开输出
     rPDATC |= 1 << 2;      //电机离合器闭合
	}

void PwmWork(void *args) 
{

 int a0=0;
	while(1)
	{
    		bsp_puts("PWM正在工作!\n");
    	    a0 = Read_Adc(2);	
    	    a0=a0+1;
    		tm_delay(200);
	}
}



// 根任务
void root(void) 
{
	UINT	tid;
	
	// 先清一次看门狗
	clrwtd();
    	LeftDone(3000);
    	tm_delay(10);

    	RightDone(3000);
    	tm_delay(10);   	
	// 创建串口命令接收任务
	(void)t_create("DZ", 3, GetPkt, 0, 0, 1, &tid);
	// 创建PWM任务	
	(void)t_create("PWM", 4, PwmWork, 0, 0, 1, &tid);
		
	// 根任务现在变成看门狗任务,1秒清一次看门狗
	while(1)
	{
		clrwtd();
		bsp_puts("root任务正在执行...\n");
           
    	 
    	LeftDone(1900);
    	tm_delay(500);   
    	LeftDone(1000);
    	tm_delay(500);   
    	LeftDone(3000);
    	tm_delay(70);


    	RightDone(1900);
    	tm_delay(500);  
    	RightDone(1000);
    	tm_delay(500);  
    	RightDone(3000);
    	tm_delay(70);
    	
	}	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -