¡°ÉÏÍø¹äÆë³µÃ½±ÓÎɽ¶«¡±»î¶¯Æô¶¯

Àî×Ô¿¡£©´Ó±¾ÔÂ5ÈÕ¿ªÊ¼£¬ÊÐÃñÖ»Òªä¯ÀÀÂÃÓÎÌåÑéÍøÕ¾£¬¾Í¿É»ñµÃÕæÊµµÄÂÃÓλú»á¡£ÕâÊÇɽ¶«Ê¡ÂÃÓξÖÍÆ³öµÄ¡°ÉÏÍø¹äÆë³£¬µÃ½±ÓÎɽ¶«¡±»î¶¯£¬Ê×´ÎÈÃÂÃÓδÓÐéÄâµÄÍøÉÏ£¬×ßµ½ÁËÉú»îµÄÏÖʵ¡£ ????ΪÉú¶¯Õ¹Ê¾É½¶«Ê¡ ...
#include "sys.h" #include "delay.h" #include "usart.h" #include "includes.h" #include "led.h" /************************************************ ALIENTEK ¾«Ó¢°æSTM32¿ª·¢°åUCOSʵÑé Àý6-1 UCOSIII ÈÎÎñ´´½¨ÓÚɾ³ý ¼¼ÊõÖ§³Ö£ºwww.openedv.com ÌÔ±¦µêÆÌ£ºhttp://eboard.taobao.com ¹Ø×¢Î¢ÐŹ«ÖÚÆ½Ì¨Î¢Ðźţº"ÕýµãÔ­×Ó"£¬Ãâ·Ñ»ñÈ¡STM32×ÊÁÏ¡£ ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ ×÷ÕߣºÕýµãÔ­×Ó @ALIENTEK ************************************************/ //UCOSIIIÖÐÒÔÏÂÓÅÏȼ¶Óû§³ÌÐò²»ÄÜʹÓã¬ALIENTEK //½«ÕâЩÓÅÏȼ¶·ÖÅ䏸ÁËUCOSIIIµÄ5¸öϵͳÄÚ²¿ÈÎÎñ //ÓÅÏȼ¶0£ºÖжϷþÎñ·þÎñ¹ÜÀíÈÎÎñ OS_IntQTask() //ÓÅÏȼ¶1£ºÊ±ÖÓ½ÚÅÄÈÎÎñ OS_TickTask() //ÓÅÏȼ¶2£º¶¨Ê±ÈÎÎñ OS_TmrTask() //ÓÅÏȼ¶OS_CFG_PRIO_MAX-2£ºÍ³¼ÆÈÎÎñ OS_StatTask() //ÓÅÏȼ¶OS_CFG_PRIO_MAX-1£º¿ÕÏÐÈÎÎñ OS_IdleTask() /* ΪÁËʵÏÖÁÙ½çÇøµÄ±£»¤£¬UCOSIIIÌṩÁËÁ½¸öºê£ºOS_CRITICAL_ENTER() ºÍOS_CRITICAL_EXIT()¡£ µ±Ò»¸öÈÎÎñ»òÖжϽøÈëÁÙ½çÇøÊ±£¬Ëü±ØÐëµ÷ÓÃOS_CRITICAL_ENTER()ºêÒÔ»ñµÃÁÙ½çÇøµÄ±£»¤¡£ Õâ¸öºê½«½ûÓÃÖжϣ¬ÒÔÈ·±£Ö´ÐÐÁÙ½çÇøµÄ´úÂë²»»á±»ÖжϻòÇÀÕ¼£¬´Ó¶ø±£Ö¤ÁËÁÙ½çÇøµÄÔ­×ÓÐÔ¡£ µ±´úÂëÖ´ÐÐÍê±Ïʱ£¬ÈÎÎñ»òÖжϱØÐëµ÷ÓÃOS_CRITICAL_EXIT()ºêÀ´»Ö¸´Öжϣ¬ÒÔ±ãÆäËûÈÎÎñºÍÖжϿÉÒÔ·ÃÎʹ²Ïí×ÊÔ´²¢Ö´ÐÐËüÃǵĴúÂë¡£ ʹÓÃOS_CRITICAL_ENTER()ºÍOS_CRITICAL_EXIT()ºêÀ´±£»¤ÁÙ½çÇø£¬ ÄÇôÔÚÈÎÎñT1Ö´ÐеÄÕû¸öʱ¼äÄÚ£¬ÖжϽ«±»½ûÓ㬠ÆäËûÈÎÎñ½«²»ÄÜ·ÃÎʹ²Ïí×ÊÔ´²¢ÇÒÁÙ½çÇøµÄ´úÂ뽫ÒÔÔ­×Ó·½Ê½Ö´ÐÐÍê±Ï¡£ ÕâÑù¿ÉÒÔÈ·±£ÁÙ½çÇø´úÂëµÄÕýÈ·ÐÔ£¬±ÜÃ⾺ÕùÌõ¼þºÍÆäËûͬ²½ÎÊÌâ¡£ */ /* ÔÚUCOS IIIÖУ¬ÈÎÎñµÄÖ´ÐÐ˳ÐòÊÇ»ùÓÚÓÅÏȼ¶µ÷¶ÈËã·¨¡£ ÿ¸öÈÎÎñ¶¼ÓÐÒ»¸öÓÅÏȼ¶£¨0µ½255£©£¬¾ßÓиü¸ßÓÅÏȼ¶µÄÈÎÎñ±ÈµÍÓÅÏȼ¶µÄÈÎÎñ¸ü¿ÉÄܵõ½µ÷¶È¡£ UCOS IIIʹÓÃÇÀռʽµ÷¶È£¬ÕâÒâζ×ŵ±ÓÐÒ»¸ö¸ßÓÅÏȼ¶µÄÈÎÎñ¾ÍÐ÷ʱ£¬µ±Ç°ÕýÔÚÖ´ÐеÄÈÎÎñ½«±»Öжϲ¢ÇÒ¸ßÓÅÏȼ¶ÈÎÎñ½«±»Ö´ÐС£ ÕâÈ·±£Á˾ßÓиü¸ßÓÅÏȼ¶µÄÈÎÎñ¿ÉÒÔ¼°Ê±»ñµÃÖ´ÐУ¬±ÜÃⳤʱ¼ä±»µÍÓÅÏȼ¶ÈÎÎñÕ¼Óô¦ÀíÆ÷µÄÇé¿ö·¢Éú¡£ UCOS IIIÈÎÎñµÄÖ´ÐÐÊÇͨ¹ýÉÏÏÂÎÄÇл»ÊµÏֵġ£ ÉÏÏÂÎÄÇл»ÊÇÖ¸½«´¦ÀíÆ÷µÄ״̬´ÓÒ»¸öÈÎÎñ±£´æµ½Äڴ棬Ȼºó½«ÁíÒ»¸öÈÎÎñµÄ×´Ì¬×°ÔØµ½´¦ÀíÆ÷ÖУ¬ÒÔÔÚ²»¼ä¶ÏµÄÇé¿öÏÂת»»ÈÎÎñÖ´ÐС£ µ±Ò»¸öÈÎÎñÐèÒª±»ÖÐֹʱ£¬¼´Ö´ÐÐOS_TaskSuspend()º¯Êýʱ£¬UCOS III´¦ÀíÆ÷»áÖ´ÐÐÒ»¸öÈÎÎñÇл»Öжϲ¢½«¿ØÖÆÈ¨×ªÒƵ½ÁíÒ»¸öÈÎÎñ¡£ ÈÎÎñÇл»Í¨³£·¢ÉúÔÚÒÔÏÂÇé¿öÏ£º µ±ÈÎÎñÖ÷¶¯µ÷ÓÃÁËÈÎÎñ¿ØÖƺ¯Êý£¨ÀýÈ磬OS_Delay()¡¢OS_EventWait()¡¢OS_TaskSuspend()µÈ£©²¢ÍËÈÃCPUʱ£» µ±Ä³¸öÖжϷþÎñ³ÌÐò(ISR)ÔڹؼüÈÎÎñÖ´ÐÐÆÚ¼äÖ´ÐУ¨¼´ÖжÏÓÅÏȼ¶¸ßÓڹؼüÈÎÎñµÄÓÅÏȼ¶£©¡£ */ //¿ªÊ¼ÈÎÎñ£¬´´½¨ÍêÈÎÎñ¶þºÍÈÎÎñÈý¾Íɾ³ý×Ô¼º //ÈÎÎñÓÅÏȼ¶ #define START_TASK_PRIO 3 //ÈÎÎñ¶ÑÕ»´óС #define START_STK_SIZE 128 //ÈÎÎñ¿ØÖÆ¿é OS_TCB StartTaskTCB; //ÈÎÎñ¶ÑÕ» CPU_STK START_TASK_STK[START_STK_SIZE]; //ÈÎÎñº¯Êý void start_task(void *p_arg); ///ÈÎÎñ¶þÁÁµÆ£¬²¢´òÓ¡³öÐÅÏ¢ //ÈÎÎñÓÅÏȼ¶ #define TASK1_TASK_PRIO 4 //ÈÎÎñ¶ÑÕ»´óС #define TASK1_STK_SIZE 128 //ÈÎÎñ¿ØÖÆ¿é OS_TCB Task1_TaskTCB; //ÈÎÎñ¶ÑÕ» CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE]; void task1_task(void *p_arg); ///ÈÎÎñÈý£¬´òÓ¡ÈÎÎñÈýÖ´ÐÐÐÅÏ¢ //ÈÎÎñÓÅÏȼ¶ #define TASK2_TASK_PRIO 5 //ÈÎÎñ¶ÑÕ»´óС #define TASK2_STK_SIZE 128 //ÈÎÎñ¿ØÖÆ¿é OS_TCB Task2_TaskTCB; //ÈÎÎñ¶ÑÕ» CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE]; //ÈÎÎñº¯Êý void task2_task(void *p_arg); volatile u8 key_pressed = 0; volatile u8 current_task = 1; void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // ???? GPIO_Init(GPIOA, &GPIO_InitStructure); } void Key_Scan(void) { static u8 key_up = 1; if (key_up && GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) { delay_ms(20); // ?? if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) { key_up = 0; key_pressed = 1; // ?????? } } else if (!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) { key_up = 1; } } //Ö÷º¯Êý int main(void) { OS_ERR err; CPU_SR_ALLOC(); SystemInit();//ÓÉÓÚ±¾¹¤³ÌÊÇÓÉstm32f103zet6ÒÆÖ²ËùÀ´£¬Òò´ËÕâÀïÒò¼ÓÈë±¾º¯ÊýÈ·±£delayº¯ÊýÕý³£Ê¹Óà delay_init(); //ʱÖÓ³õʼ»¯ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÖжϷÖ×éÅäÖà uart_init(115200); //´®¿Ú³õʼ»¯ LED_Init(); KEY_Init(); // ??????? OSInit(&err); //³õʼ»¯UCOSIII OS_CRITICAL_ENTER(); //½øÈëÁÙ½çÇø //´´½¨¿ªÊ¼ÈÎÎñ OSTaskCreate((OS_TCB * )&StartTaskTCB, //ÈÎÎñ¿ØÖÆ¿é (CPU_CHAR * )"start task", //ÈÎÎñÃû×Ö (OS_TASK_PTR )start_task, //ÈÎÎñº¯Êý (void * )0, //´«µÝ¸øÈÎÎñº¯ÊýµÄ²ÎÊý (OS_PRIO )START_TASK_PRIO, //ÈÎÎñÓÅÏȼ¶ (CPU_STK * )&START_TASK_STK[0], //ÈÎÎñ¶ÑÕ»»ùµØÖ· (CPU_STK_SIZE)START_STK_SIZE/10, //ÈÎÎñ¶ÑÕ»Éî¶ÈÏÞλ (CPU_STK_SIZE)START_STK_SIZE, //ÈÎÎñ¶ÑÕ»´óС (OS_MSG_QTY )0, //ÈÎÎñÄÚ²¿ÏûÏ¢¶ÓÁÐÄܹ»½ÓÊÕµÄ×î´óÏûÏ¢ÊýÄ¿,Ϊ0ʱ½ûÖ¹½ÓÊÕÏûÏ¢ (OS_TICK )0, //µ±Ê¹ÄÜʱ¼äƬÂÖתʱµÄʱ¼äƬ³¤¶È£¬Îª0ʱΪĬÈϳ¤¶È£¬ (void * )0, //Óû§²¹³äµÄ´æ´¢Çø (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //ÈÎÎñÑ¡Ïî (OS_ERR * )&err); //´æ·Å¸Ãº¯Êý´íÎóʱµÄ·µ»ØÖµ OS_CRITICAL_EXIT(); //Í˳öÁÙ½çÇø OSStart(&err); //¿ªÆôUCOSIII } //¿ªÊ¼ÈÎÎñÈÎÎñº¯Êý void start_task(void *p_arg) { OS_ERR err; CPU_SR_ALLOC(); p_arg = p_arg; CPU_Init(); #if OS_CFG_STAT_TASK_EN > 0u OSStatTaskCPUUsageInit(&err); //ͳ¼ÆÈÎÎñ #endif #ifdef CPU_CFG_INT_DIS_MEAS_EN //Èç¹ûʹÄÜÁ˲âÁ¿ÖжϹرÕʱ¼ä CPU_IntDisMeasMaxCurReset(); #endif #if OS_CFG_SCHED_ROUND_ROBIN_EN //µ±Ê¹ÓÃʱ¼äƬÂÖתµÄʱºò //ʹÄÜʱ¼äƬÂÖתµ÷¶È¹¦ÄÜ,ʱ¼äƬ³¤¶ÈΪ1¸öϵͳʱÖÓ½ÚÅÄ£¬¼È1*5=5ms OSSchedRoundRobinCfg(DEF_ENABLED,1,&err); #endif OS_CRITICAL_ENTER(); //½øÈëÁÙ½çÇø //´´½¨TASK1ÈÎÎñ OSTaskCreate((OS_TCB * )&Task1_TaskTCB, (CPU_CHAR * )"Task1 task", (OS_TASK_PTR )task1_task, (void * )0, (OS_PRIO )TASK1_TASK_PRIO, (CPU_STK * )&TASK1_TASK_STK[0], (CPU_STK_SIZE)TASK1_STK_SIZE/10, (CPU_STK_SIZE)TASK1_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //´´½¨TASK2ÈÎÎñ OSTaskCreate((OS_TCB * )&Task2_TaskTCB, (CPU_CHAR * )"task2 task", (OS_TASK_PTR )task2_task, (void * )0, (OS_PRIO )TASK2_TASK_PRIO, (CPU_STK * )&TASK2_TASK_STK[0], (CPU_STK_SIZE)TASK2_STK_SIZE/10, (CPU_STK_SIZE)TASK2_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); OS_CRITICAL_EXIT(); //Í˳öÁÙ½çÇø OSTaskDel((OS_TCB*)0,&err); //ɾ³ýstart_taskÈÎÎñ×ÔÉí } // ??1:??PB0(LED0) void task1_task(void *p_arg) { OS_ERR err; while (1) { Key_Scan(); if (key_pressed) { current_task = 2; // ?????2 key_pressed = 0; printf("Switch to Task2\n"); } else { // LED0?? GPIO_SetBits(GPIOB, GPIO_Pin_0); // LED0? OSTimeDlyHMSM(0, 0, 0, 5000, OS_OPT_TIME_HMSM_STRICT, &err); // 500ms GPIO_ResetBits(GPIOB, GPIO_Pin_0); // LED0? OSTimeDlyHMSM(0, 0, 0, 5000, OS_OPT_TIME_HMSM_STRICT, &err); // 500ms } } } void task2_task(void *p_arg) { OS_ERR err; while (1) { Key_Scan(); if (key_pressed) { current_task = 1; // ?????1 key_pressed = 0; printf("Switch back to Task1\n"); } else { // ????2??? // ??:LED1?? GPIO_SetBits(GPIOB, GPIO_Pin_1); // LED1? OSTimeDlyHMSM(0, 0, 0, 5000, OS_OPT_TIME_HMSM_STRICT, &err); // 500ms GPIO_ResetBits(GPIOB, GPIO_Pin_1); // LED1? OSTimeDlyHMSM(0, 0, 0, 5000, OS_OPT_TIME_HMSM_STRICT, &err); // 500ms } } }我现在需要刚开始时B0(任务一)LED闪烁,当按下按键后(A0)给予信息量,使得代码进入(任务二),再次摁下按键,两个任务均不执行
06-06
static float Bias,Pwm,Integral_bias,Last_Bias; int Position_PID (int Encoder,int Target) { Bias=Encoder-Target; //&frac14;ÆËãÆ«²î Integral_bias+=Bias; //Çó&sup3;öÆ«²îµÄ»ý·Ö // Pwm=70*Bias*Ratio+0.00*Integral_bias*Ratio+200*(Bias-Last_Bias)*Ratio; //λÖÃÊ&frac12;PID¿ØÖÆÆ÷ Pwm=100*Bias*Ratio+0.00*Integral_bias*Ratio+250*(Bias-Last_Bias)*Ratio; //λÖÃÊ&frac12;PID¿ØÖÆÆ÷ Last_Bias=Bias; //±£´æÉÏÒ»´ÎÆ«²î return Pwm; //ÔöÁ¿Êä&sup3;ö } int Position_PID_1 (int Encoder,float Target) { static float Bias,Pwm,Integral_bias,Last_Bias,encoder; encoder=(float)Encoder; Bias=encoder-Target; //&frac14;ÆËãÆ«²î Integral_bias+=Bias; //Çó&sup3;öÆ«²îµÄ»ý·Ö // Pwm=90*Bias*Ratio+0.00*Integral_bias*Ratio+250*(Bias-Last_Bias)*Ratio; //λÖÃÊ&frac12;PID¿ØÖÆÆ÷ Pwm=90*Bias*Ratio+0.00*Integral_bias*Ratio+250*(Bias-Last_Bias)*Ratio; //λÖÃÊ&frac12;PID¿ØÖÆÆ÷ Last_Bias=Bias; //±£´æÉÏÒ»´ÎÆ«²î return Pwm; //ÔöÁ¿Êä&sup3;ö } int Position_PID_3 (int Encoder,int Target) { static float Bias,Pwm,Integral_bias,Last_Bias; Bias=Encoder-Target; //&frac14;ÆËãÆ«²î Integral_bias+=Bias; //Çó&sup3;öÆ«²îµÄ»ý·Ö // Pwm=70*Bias*Ratio+0.00*Integral_bias*Ratio+200*(Bias-Last_Bias)*Ratio; //λÖÃÊ&frac12;PID¿ØÖÆÆ÷ // Pwm=280*Bias*Ratio+0.00*Integral_bias*Ratio+300*(Bias-Last_Bias)*Ratio; //λÖÃÊ&frac12;PID¿ØÖÆÆ÷ Pwm=90*Bias*Ratio+0.00*Integral_bias*Ratio+250*(Bias-Last_Bias)*Ratio; //λÖÃÊ&frac12;PID¿ØÖÆÆ÷ Last_Bias=Bias; //±£´æÉÏÒ»´ÎÆ«²î return Pwm; //ÔöÁ¿Êä&sup3;ö } u16 Count_Next=0; static int Angle_Max,Position_Max; static u8 Flag_Back; u16 number=0; //int Count_FZ,Target_Position=10580; /************************************************************************** º¯Êý&sup1;¦ÄÜ£º×Ô¶¯Æð°Ú&sup3;ÌÐò Èë¿Ú²ÎÊý£ºint ·µ»Ø Öµ£º **************************************************************************/ void Run(u8 Way) { static float Count_FZ,Target_Position=10450; static float Count_Big_Angle=0.046542; if(Way==2) //ÊÖ¶¯Æð°Ú&sup3;ÌÐò { if(Angle_Balance<(ZHONGZHI+200)&&Angle_Balance>(ZHONGZHI-200)) //µ&frac12;µ×&frac12;Ó&frac12;üÆ&frac12;ºâλÖà &frac14;´¿É¿ªÆôÆ&frac12;ºâϵÍ&sup3; { State=1; //µ&sup1;Á¢×´Ì¬ÖÃ1 Way_Turn=0;//Æð°Ú±êÖ&frac34;λÇåÁã } } } /************************************************************************** º¯Êý&sup1;¦ÄÜ£ºÇã&frac12;ÇPD¿ØÖÆ Èë¿Ú²ÎÊý£º&frac12;Ç¶È ·µ»Ø Öµ£ºÇã&frac12;Ç¿ØÖÆPWM **************************************************************************/ int balance_0(float Angle) { float Bias; //Çã&frac12;ÇÆ«²î static float Last_Bias,D_Bias,I_Bias; //PIDÏà&sup1;رäÁ¿ int balance; Bias=Angle-ZHONGZHI; I_Bias+=Bias; D_Bias=Bias-Last_Bias; balance=-Balance_KP*Bias- D_Bias*Balance_KD+ I_Bias*Balance_Ratio; Last_Bias=Bias; return balance; //PWM·µ»ØÖµ //Çó&sup3;öÆ&frac12;ºâµÄ&frac12;ǶÈÖÐÖµ ºÍ»úеÏà&sup1;Ø //Îó²î×öÀÛ&frac14;Ó£¬×ö»ý·Ö¶ÔÏó //Çó&sup3;öÆ«²îµÄ΢·Ö &frac12;øÐÐ΢·Ö¿ØÖÆ //Ê&sup1;ÓÃλÖÃPIDËã·¨&sup1;«Ê&frac12;¸øPWM¸&sup3;Öµ£¬Æ&frac12;ºâ¿ØÖÆÐèÒª¿ìËÙ·´Ó¦£¬Ê&sup1;ÓÃPD¿ØÖÆËã·¨£¬&frac14;´»ý·Ö²ÎÊýΪÁã //ÉÏ´ÎÎó²îµÈÓÚµ±Ç°Îó²î //º¯Êý·µ»ØÖµÎªÇã&frac12;Ç¿ØÖÆPWMÖµ } /************************************************************************** º¯Êý&sup1;¦ÄÜ£ºÎ»ÖÃPD¿ØÖÆ Èë¿Ú²ÎÊý£º±àÂëÆ÷ ·µ»Ø Öµ£ºÎ»ÖÿØÖÆPWM **************************************************************************/ int Position_0(int Encoder) { static float Position_PWM, Last_Position, Position_Bias, Position_Differential; static float Position_Least; Position_Least=Encoder-Position_Zero; //=-???? Position_Bias *=0.8; Position_Bias += Position_Least*0.2; Position_Differential=Position_Bias-Last_Position; Last_Position=Position_Bias; Position_PWM =Position_Bias*Position_KP+Position_Differential*Position_KD; return Position_PWM; //¶¨ÒåλÖÿØÖƱäÁ¿£¬·Ö±ðÐèÒª¶¨Òå¿ØÖÆPWMÖµ¡¢ÉÏÒ»´ÎµÄλÖÃÖµ¡¢µ±Ç°Î»ÖÃÖµ¡¢Î¢·Ö¶ÔÏóÖµ //¶¨ÒåλÖÃÎó²î±äÁ¿ //===»ñȡλÖÃÆ«²îÁ¿£¬&frac14;´Îó²îÁ¿ //Ò»&frac12;×µÍͨÂ˲¨Æ÷Ëã·¨ //===Ò»&frac12;×µÍͨÂ˲¨Æ÷ //===»ñȡƫ²î±ä»¯ÂÊ£¬µ±Ç°Îó²îÓëÉÏ´ÎÎó²îÇó²î£¬&frac14;´Î¢·Ö¶ÔÏóÖµ //ÉÏ´ÎÎó²îµÈÓÚµ±Ç°Îó²î£¬±£´æÉÏÒ»´ÎµÄÆ«²î //===Ê&sup1;ÓÃλÖÃPIDËã·¨&sup1;«Ê&frac12;¸øPWM¸&sup3;Öµ£¬ÐèҪλÖÿìËÙ·´Ó¦£¬²ÉÓÃPDËã·¨£¬&frac14;´»ý·Ö²ÎÊýΪÁã //º¯Êý·µ»ØÖµÎªµ&sup1;Á¢°ÚλÖÿØÖÆPWMÖµ } /************************************************************************** º¯Êý&sup1;¦ÄÜ£ºÏÞÖÆPWM¸&sup3;Öµ Èë¿Ú²ÎÊý£ºÎÞ ·µ»Ø Öµ£ºÎÞ **************************************************************************/ void Xianfu_Pwm(void) { int Amplitude=6900; //===PWMÂú·ùÊÇ7200 ÏÞÖÆÔÚ6900 if(Moto<-Amplitude) Moto=-Amplitude; if(Moto>Amplitude) Moto=Amplitude; } /************************************************************************** º¯Êý&sup1;¦ÄÜ£ºÒì&sup3;£&sup1;رյç»ú Èë¿Ú²ÎÊý£ºµçÑ&sup1; ·µ»Ø Öµ£º1£ºÒì&sup3;£ 0£ºÕý&sup3;£ **************************************************************************/ u8 Turn_Off(void) { u8 temp; if(Flag_Stop==1||(State==1 && (Angle_Balance<(ZHONGZHI-460)||Angle_Balance>(ZHONGZHI+460)))) //&sup1;رյç»ú { Flag_Stop=0; Way_Turn=0; Flag_qb2=0; Angle_Max=0; Position_Max=0; State=0; temp=1; TIM_SetCounter(TIM2,10000);//&sup3;õÊ&frac14;»¯&frac14;ÆÊýÆ÷&sup3;õÖµ } else { temp=0; } return temp; } void Encoder_App(void) { if(State == 0) //Æð°Úʱ²ÉÑùÈ¡3´ÎÇóÆ&frac12;&frac34;ù£¬5´ÎÖÜÆÚÌ«&sup3;¤ { Angle_Balance=Get_ADC(5); } if(State==1) { Angle_Balance=Get_ADC(20);//´Ë¿ØÖÆÖÜÆÚ²»ÐèÒªÄÇô¶Ì£¬Æð°Ú&sup3;É&sup1;¦ºó²ÉÑùÈ¡5´ÎÇóÆ&frac12;&frac34;ùÖµ£¬ } D_Angle_Balance= Angle_Balance-Last_Angle_Balance ; //===»ñȡ΢·ÖÖµ if (State == 0 && Way_Turn ==1) { if(Angle_Balance<(ZHONGZHI+200)&&Angle_Balance>(ZHONGZHI-200)) //µ&frac12;µ×&frac12;Ó&frac12;üÆ&frac12;ºâλÖà &frac14;´¿É¿ªÆôÆ&frac12;ºâϵÍ&sup3; { State=1; //µ&sup1;Á¢×´Ì¬ÖÃ1 Way_Turn=0;//×Ô¶¯Æð°Ú±êÖ&frac34;λÇåÁã Flag_qb=0; //×Ô¶¯Æð°Ú²&frac12;ÖèÇåÁã Angle_Max=0; Flag_Back=0; } } if(State==0) { Run(Way_Turn);//Æð°Ú ÓÉÈë¿Ú²ÎÊý¿ØÖÆ 1£º×Ô¶¯Æð°Ú 2£ºÊÖ¶¯Æð°Ú if(Turn_Off()==1) //°´ÏÂÍ£Ö&sup1;&frac14;üʱͣÖ&sup1;µç»ú { Moto_qb=0; } } if(State==1) //Æð°Ú&sup3;É&sup1;¦Ö®ºó£¬&frac12;øÐе&sup1;Á¢¿ØÖÆ { Balance_Pwm =balance_0(Angle_Balance); //¿ªÆôÆ&frac12;ºâ¿ØÖÆ if(Flag_qb2==0) //λÖÿØÖÆÑÓʱÆô¶¯ { if(Angle_Balance<(ZHONGZHI+200)&&Angle_Balance>(ZHONGZHI-200))Count_Position++; // if(Count_Position>20)Flag_qb2=1, Count_Position=0,TIM_SetCounter(TIM2,10000); //ÔÚÆ&frac12;ºâλÖõ&sup1;Á¢&sup3;¬&sup1300ms ¿ªÆôλÖÿØÖÆ } if(Flag_qb2==1) //¿ªÆôλÖÿØÖÆ { Encoder=TIM_GetCounter(TIM2); //===¸üбàÂëÆ÷λÖÃÐÅÏ¢ if(++Count_P2>=4) Position_Pwm=Position_0(Encoder),Count_P2=0; //===λÖÃPD¿ØÖÆ 25ms&frac12;øÐÐÒ»´ÎλÖÿØÖÆ } Moto=Balance_Pwm-Position_Pwm; //===&frac14;ÆËãµç»ú×îÖÕPWM Xianfu_Pwm(); //===PWMÏÞ·ù if(Turn_Off()==1) //°´ÏÂÍ£Ö&sup1;&frac14;ü»òÕßÇã&frac12;Ç&sup1;ý´ó±£»¤£¬µç»úÍ£Ö&sup1; { Moto=0; } if(Moto>7200) Moto=7200; if(Moto<-7200)Moto=-7200; Set_Pwm(Moto); //===¸&sup3;Öµ¸øPWM&frac14;Ä´æÆ÷ } Last_Angle_Balance=Angle_Balance; //===±£´æÉÏÒ»´ÎµÄÇã&frac12;ÇÖµ } 解释上述代码
05-22
////////////////////////////////////////////////////////////////////////////////// //±&frac34;&sup3;ÌÐòÖ»&sup1;©Ñ§Ï°Ê&sup1;Óã¬Î´&frac34;­×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃÍ&frac34; //ÐÀÞ±µç×Ó // // ÎÄ &frac14;þ Ãû :yanwu.c // °æ ±&frac34; ºÅ : v1.0 // ×÷ Õß : ÐÀÞ±µç×Ó // Éú&sup3;ÉÈÕÆÚ : 20200101 // ×î&frac12;üÐÞ¸Ä : // &sup1;¦ÄÜÃèÊö :Ö÷º¯Êý // ÐÞ¸ÄÀúÊ· : // ÈÕ ÆÚ : // ×÷ Õß : ÐÀÞ±µç×Ó // ÐÞ¸ÄÄÚÈÝ : ´´&frac12;¨ÎÄ&frac14;þ //°æÈ¨ËùÓУ¬µÁ°æ±Ø&frac34;¿¡£ //Copyright(C) ÐÀÞ±µç×Ó2020/3/16 //All rights reserved //******************************************************************************/. //&sup3;ÌÐòÍ·º¯Êý #include <reg52.h> #include <intrins.h> //°üº¬Í·ÎÄ&frac14;þ //ÏÔÊ&frac34;º¯Êý #include <display.h> //ºê¶¨Òå #define uint unsigned int #define uchar unsigned char //&sup1;Ü&frac12;ÅÉùÃ÷ sbit LED_R= P2^2;//ºìµÆ sbit LED_G= P2^0;//ÂÌµÆ sbit FENG = P2^5;//·äÃùÆ÷ //sbit san=P3^4; //·çÉÈ¿ØÖÆ£¨Ñ¡Å䣩 sbit CS = P1^4; sbit Clk = P1^2; sbit DATI = P1^3; sbit DATO = P1^3; //ADC0832Òý&frac12;Å //°´&frac14;ü sbit Key1=P2^6; //ÉèÖÃ&frac14;ü sbit Key2=P2^7; //&frac14;Ó°´&frac14;ü sbit Key3=P3^7; //&frac14;õ°´&frac14;ü bit bdata flag; //±¨&frac34;¯±êÖ&frac34;λ uchar set; //ÉèÖÃ״̬ /*******************************¶¨ÒåÈ«&frac34;Ö±äÁ¿********************************/ unsigned char dat = 0; //ADÖµ unsigned char CH=0; //ͨµÀ±äÁ¿ unsigned int sum=0; //Æ&frac12;&frac34;ùÖµ&frac14;ÆËãʱµÄ×ÜÊý unsigned char m=0; //º¯ÊýÉùÃ÷ extern uchar ADC0809(); extern void Key(); //&frac34;Æ&frac34;«º¬Á¿±äÁ¿ uchar temp=0; uchar WARNING=25; //±¨&frac34;¯Öµ /**************************************************************************** º¯Êý&sup1;¦ÄÜ:ADת»»×Ó&sup3;ÌÐò Èë¿Ú²ÎÊý:CH &sup3;ö¿Ú²ÎÊý:dat ****************************************************************************/ unsigned char adc0832(unsigned char CH) { unsigned char i,test,adval; adval = 0x00; test = 0x00; Clk = 0; //&sup3;õÊ&frac14;»¯ DATI = 1; _nop_(); CS = 0; _nop_(); Clk = 1; _nop_(); if ( CH == 0x00 ) //ͨµÀÑ¡Ôñ { Clk = 0; DATI = 1; //ͨµÀ0µÄµÚһλ _nop_(); Clk = 1; _nop_(); Clk = 0; DATI = 0; //ͨµÀ0µÄµÚ¶þλ _nop_(); Clk = 1; _nop_(); } else { Clk = 0; DATI = 1; //ͨµÀ1µÄµÚһλ _nop_(); Clk = 1; _nop_(); Clk = 0; DATI = 1; //ͨµÀ1µÄµÚ¶þλ _nop_(); Clk = 1; _nop_(); } Clk = 0; DATI = 1; for( i = 0;i < 8;i++ ) //¶Áȡǰ8λµÄÖµ { _nop_(); adval <<= 1; Clk = 1; _nop_(); Clk = 0; if (DATO) adval |= 0x01; else adval |= 0x00; } for (i = 0; i < 8; i++) //¶ÁÈ¡ºó8λµÄÖµ { test >>= 1; if (DATO) test |= 0x80; else test |= 0x00; _nop_(); Clk = 1; _nop_(); Clk = 0; } if (adval == test) //±È&frac12;Ïǰ8λÓëºó8λµÄÖµ£¬Èç&sup1;û²»ÏàͬÉáÈ¥¡£ÈôÒ»Ö±&sup3;öÏÖÏÔÊ&frac34;ΪÁ㣬Çë&frac12;«¸ÃÐÐÈ¥µô dat = test; nop_(); CS = 1; //ÊÍ·ÅADC0832 DATO = 1; Clk = 1; return dat; } void init() //&sup3;õÊ&frac14;»¯º¯Êý { TMOD=0x01; //&sup1;¤×÷·&frac12;Ê&frac12; TL0=0xb0; TH0=0x3c; //¸&sup3;&sup3;õÖµ£¨12MHz&frac34;§ÕñµÄ50ms£© EA=1; //´ò¿ªÖжÏ×Ü¿ª&sup1;Ø ET0=1; //´ò¿ªÖжÏÔÊÐí¿ª&sup1;Ø TR0=1; //´ò¿ª¶¨Ê±Æ÷¿ª&sup1;Ø } void main() //Ö÷º¯Êý { Init1602();//&sup3;õÊ&frac14;»¯ÏÔÊ&frac34; init(); //&sup3;õÊ&frac14;»¯¶¨Ê±Æ÷ while(1) //&frac12;øÈëÑ­»· { for(m=0;m<50;m++) //¶Á50´ÎADÖµ sum = adc0832(0)+sum; //¶Áµ&frac12;µÄADÖµ£¬&frac12;«¶Áµ&frac12;µÄÊý&frac34;ÝÀÛ&frac14;Óµ&frac12;sum temp=sum/50; //Ìø&sup3;öÉÏÃæµÄforÑ­»·ºó£¬&frac12;«ÀÛ&frac14;ÓµÄ×ÜÊý&sup3;ýÒÔ50µÃµ&frac12;Æ&frac12;&frac34;ùÖµtemp sum=0; //Æ&frac12;&frac34;ùÖµ&frac14;ÆËãÍê&sup3;ɺó£¬&frac12;«×ÜÊýÇåÁã if(set==0) //Ö»ÓÐÔÚ·ÇÉèÖÃ״̬ʱ£¬ Display_1602(temp,WARNING); //²ÅË¢ÐÂÏÔÊ&frac34;ʵʱŨ¶ÈÖµ if(temp<WARNING&&set==0) //·ÇÉèÖÃʱµ±Å¨¶ÈֵСÓÚ±¨&frac34;¯ÖµÊ± { flag=0; //±¨&frac34;¯±êÖ&frac34;λÖÃ0£¬²»±¨&frac34;¯ } else if(temp>WARNING&&set==0) //·ÇÉèÖÃʱµ±Å¨¶ÈÖµ´óÓÚ±¨&frac34;¯ÖµÊ± { flag=1; //±¨&frac34;¯±êÖ&frac34;λÖÃ1 } Key(); //ɨÃè°´&frac14;ü } } void Key() //°´&frac14;üº¯Êý { if(Key1==0) //ÉèÖÃ&frac14;ü°´ÏÂʱ { while(Key1==0); //&frac14;ì²â°´&frac14;üÊÇ·ñÊÍ·Å FENG=0; //·äÃùÆ÷Ïì set++; //ÉèÖÃ״̬±êÖ&frac34;&frac14;Ó flag=0; //Í£Ö&sup1;±¨&frac34;¯ // san=1; //·çÉÈÍ£Ö&sup1;ת¶¯£¨Ñ¡Å䣩 TR0=0; //¶¨Ê±Æ÷Í£Ö&sup1; } if(set==1) //ÉèÖÃʱ { write_com(0x38);//ÆÁÄ»&sup3;õÊ&frac14;»¯ write_com(0x80+0x40+13);//Ñ¡Öб¨&frac34;¯ÖµµÄλÖà write_com(0x0f);//´ò¿ªÏÔÊ&frac34; ÎÞ&sup1;â±ê &sup1;â±êÉÁ˸ write_com(0x06);//µ±¶Á»òдһ¸ö×Ö·ûÊÇÖ¸Õëºóһһλ FENG=1; //·äÃùÆ÷Í£Ö&sup1;ÃùÏì } else if(set>=2) //ÔÙ°´Ò»ÏÂÉèÖÃ&frac14;üʱ£¬ÍË&sup3;öÉèÖà { set=0; //ÉèÖÃ״̬ÇåÁã write_com(0x38);//ÆÁÄ»&sup3;õÊ&frac14;»¯ write_com(0x0c);//´ò¿ªÏÔÊ&frac34; ÎÞ&sup1;â±ê ÎÞ&sup1;â±êÉÁ˸ FENG=1; //·äÃùÆ÷Í£Ö&sup1;Ïì flag=1; //±¨&frac34;¯±êÖ&frac34;λÖÃ1 TR0=1; //¶¨Ê±Æ÷¿ªÊ&frac14;&frac14;ÆÊ± } if(Key2==0&&set!=0) //µ±ÔÚÉèÖÃ״̬ʱ£¬°´ÏÂ&frac14;Ó&frac14;üʱ { while(Key2==0); //°´&frac14;üÊÍ·Å FENG=0; //·äÃùÆ÷ÃùÏì WARNING++; //±¨&frac34;¯ãÐÖµ&frac14;Ó if(WARNING>=255)//ãÐÖµ×î´ó&frac14;Óµ&frac12;255 WARNING=0; //ÇåÁã write_com(0x80+0x40+11); //ÔÚãÐÖµµÄλÖÃдÈëÉèÖõÄÊý&frac34;Ý write_data(&#39;0&#39;+WARNING/100); //ÏÔÊ&frac34;°Ù루&frac12;«123&sup3;ýÒÔ100µÃµ&frac12;µÄÉÌÊÇ1£¬&frac34;ÍÊǰÙλÊý&frac34;Ý£©123ΪÀý×Ó write_data(&#39;0&#39;+WARNING/10%10);//ÏÔÊ&frac34;ʮ루&frac12;«123&sup3;ýÒÔ10µÃµ&frac12;ÉÌÊÇ12£¬&frac12;«12&sup3;ýÒÔ10µÄÓàÊý&frac34;ÍÊÇʮ룩 write_data(&#39;0&#39;+WARNING%10); //ÏÔÊ&frac34;¸ö루&frac12;«123&sup3;ýÒÔ10µÄÓàÊý3&frac34;ÍÊǸöλÊý&frac34;Ý£©123ΪÀý×Ó write_com(0x80+0x40+13);//λÖà FENG=1;//·äÃùÆ÷Í£Ö&sup1; } if(Key3==0&&set!=0) //&frac14;õ°´&frac14;ü×¢ÊͲο&frac14;&frac14;Ó°´&frac14;ü²¿·Ö { while(Key3==0); FENG=0; WARNING--; if(WARNING<=0) WARNING=255; write_com(0x80+0x40+11); write_data(&#39;0&#39;+WARNING/100); write_data(&#39;0&#39;+WARNING/10%10); write_data(&#39;0&#39;+WARNING%10); write_com(0x80+0x40+13);//λÖà FENG=1; } } void time1_int(void) interrupt 1 //¶¨Ê±Æ÷º¯Êý { uchar count; TL0=0xb0; TH0=0x3c; //ÖØÐ¸&sup3;&sup3;õÖµ count++; //&frac14;ÆÊ±±äÁ¿&frac14;Ó if(count==10)//¶¨Ê±Æ÷¶¨Ê±ÊÇ50ms£¬´Ë´¦&frac14;ÆÊý10´Î£¬ÕýºÃÊÇ500ms£¬ÓÃÓÚ±¨&frac34;¯Ê± µÆÁÁºÍ·äÃùÆ÷Ïì { if(flag==0) //±¨&frac34;¯±êÖ&frac34;Ϊ0ʱ { LED_G=0; //Â̵ÆÁÁ LED_R=1; //ºìµÆÃð FENG=1; //·äÃùÆ÷²»Ïì // san=1; //·çÉȲ»×ª£¨Ñ¡Å䣩 } if(flag==1) //±¨&frac34;¯±êÖ&frac34;λΪ1ʱ { LED_G=1; //Â̵ÆÃð LED_R=0; //ºìµÆÁÁ FENG=0; //·äÃùÆ÷Ïì // san=0; //·çÉÈת¶¯£¨Ñ¡Å䣩 } } if(count==20) //&frac14;ÆÊýµ&frac12;20ʱ£¬ÕýºÃÊÇ1000ms£¬&frac34;ÍÊÇ1s£¬ÕâÀï&frac34;ÍÊÇÈõÆÃ𣬷äÃùÆ÷²»Ï죬´Ó¶ø×ö&sup3;öÉÁ˸µÄЧ&sup1;û { count=0; //&frac14;Ƶ&frac12;1sʱ£¬&frac12;«countÇåÁ㣬×&frac14;±¸ÖØÐÂ&frac14;ÆÊý if(flag==0) { LED_G=1; LED_R=1; FENG=1; // san=1; //È«²¿&sup1;Ø±Õ } if(flag==1) { LED_G=1; LED_R=1; FENG=1; // san=0; //±¨&frac34;¯Öµ£¬·çÉÈÊÇһֱת¶¯µÄ£¨Ñ¡Å䣩 } } } 修改为下限报警
最新发布
07-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值