ר¼ÒÖ§ÕÐ:¹ºÂò±ãÒË»úƱµÄÎå¸öÃØ¾÷

¿÷ËðµÄº½¿Õ¹«Ë¾Ìá¸ß»úƱºÍȼÓͷѼ۸ñÓëÓͼ۾ºÕù£¬ÆÈʹºÜ¶àÈ˾ÍËãÓпÕÏÐʱ¼ä£¬Ò²»áÑ¡Ôñ´ôÔÚ¼ÒÀï¡£½üÈÕ£¬ÃÀ¹úר¼ÒÖ§ÕУ¬ÈçºÎÂòµ½±ãÒ˵ĻúƱ¡£ 1. Ò»ÖÜÄÚ¹¤×÷×ÂýµÄʱ¶Î ÖܶþºÍÖÜÈýÊÇÉÌÎñÂÃÐÐÐèÇó×îµÍµÄʱ¼ä ...
#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
#include <reg52.h> //------------------------- Òý½Å¶¨Òå --------------------------// sbit BEEP = P2^0; //·äÃùÆ÷¿ØÖÆÒý½Å£¬?µçƽÓÐЧ sbit LED1 = P2^3; //LED1£¬¿ØÖÆÒý½Å£¬µÍµçƽÓÐЧ sbit LED2 = P2^2; //LED2£¬¿ØÖÆÒý½Å£¬µÍµçƽÓÐЧ sbit LED3 = P2^1; //LED3£¬¿ØÖÆÒý½Å£¬µÍµçƽÓÐЧ //ÊýÂë¹ÜÒý½Å¶¨Òå #define duanPore P0 //ÊýÂë¹Ü¶Î¿ØÖƶ˿ڣ¬¸ßµçƽÓÐЧ sbit DIG1 = P2^4; //ÊýÂë¹ÜµÚ1λλѡ¿ØÖƶ˿ڣ¬µÍµçƽÓÐЧ sbit DIG2 = P2^5; //ÊýÂë¹ÜµÚ2λλѡ¿ØÖƶ˿ڣ¬µÍµçƽÓÐЧ sbit DIG3 = P2^6; //ÊýÂë¹ÜµÚ3λλѡ¿ØÖƶ˿ڣ¬µÍµçƽÓÐЧ sbit DIG4 = P2^7; //ÊýÂë¹ÜµÚ4λλѡ¿ØÖƶ˿ڣ¬µÍµçƽÓÐЧ //°´¼üÒý½Å¶¨Òå sbit KEY1 = P1^0; //1ºÅÑ¡ÊÖ sbit KEY2 = P1^1; //2ºÅÑ¡ÊÖ sbit KEY3 = P1^2; //3ºÅÑ¡ÊÖ sbit KEY4 = P1^3; //4ºÅÑ¡ÊÖ sbit KEY5 = P1^4; //5ºÅÑ¡ÊÖ sbit KEY6 = P1^5; //6ºÅÑ¡ÊÖ sbit KEY7 = P3^2; //Ö÷³ÖÈ˼ü sbit KEY8 = P3^3; //ÉèÖüü //---------------------- È«¾Ö±äÁ¿¶¨Òå --------------------// //ÊýÂë¹Ü¶ÎÂë±í£¬ÊÊÓÃÓÚ¹²ÒõÊýÂë¹Ü unsigned char code tab_duan[19] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, //0~9 0x77,0x7c,0x39,0x5e,0x79,0x71, //A~F 0x40,0x00,0x48 //'-'£¬¹Ø±ÕÏÔʾ£¬'=' }; unsigned char dat_buf[4] = {17, 17, 0, 5}; //ÏÔʾÊý¾Ý»º´æÇø£¬Ä¬ÈÏÉϵçÏÔʾ" 05" int time = 5, time1 = 5, time2 = 20; //µ¹¼ÆÊ±Ê±¼ä£¬time1£ºÇÀ´ðµ¹¼ÆÊ±Ê±¼ä£¬time2£º»Ø´ðµ¹¼ÆÊ±Ê±¼ä unsigned char i = 0; unsigned int count = 0; //¼ÆÊý»º´æ±äÁ¿ bit flag_lock = 1; //¼üÅÌËø¶¨±êÖ¾£¬1£º²»Ëø¶¨£¬0£ºËø¶¨ //------------------------------- º¯ÊýÉùÃ÷ ------------------------------------// void DelayMs(unsigned int ms); //ÑÓʱº¯Êý£¬µ¥Î»£ºms void dig_scan(unsigned char *dat); unsigned char KeyScan(void); //¶ÀÁ¢°´¼üɨÃè void InitTimer0(void); //¶¨Ê±Æ÷0³õʼ»¯ void alarm(void); //±¨¾¯º¯Êý void AnswerTask(void); //ÇÀ´ðÈÎÎñ void SetTime(void); //ÉèÖõ¹¼ÆÊ±Ê±¼ä /* Ö÷º¯Êý */ void main(void) { BEEP = 0; //ÉϵçĬÈϹرշäÃùÆ÷ LED1 = 1; InitTimer0(); //¶¨Ê±Æ÷0³õʼ»¯ time = time1; //ÉϵçĬÈÏÇÀ´ðµ¹¼ÆÊ± while(1) { if(KeyScan() == 7) //Èç¹ûÖ÷³ÖÈ˼ü°´Ï£¬Ôò½øÐÐÇÀ´ð { alarm(); //·äÃùÆ÷ÏìÒ»Éù AnswerTask(); //½øÐÐÇÀ´ðÈÎÎñ } if(KeyScan() == 8) //Èç¹ûÉèÖüü°´Ï£¬½øÈëÉèÖõ¹¼ÆÊ±Ê±¼ä { alarm(); //·äÃùÆ÷ÏìÒ»Éù SetTime(); //½øÈëÉè¼Æµ¹¼ÆÊ±Ê±¼ä } dat_buf[0] = 17; dat_buf[1] = 17; dat_buf[2] = time / 10; //È¡³öµ¹¼ÆÊ±µÄʮλÊý dat_buf[3] = time % 10; //È¡³öµ¹¼ÆÊ±µÄ¸öλÊý dig_scan(dat_buf); //²âÊÔÊýÂë¹ÜÏÔʾ } } /* ÑÓʱº¯Êý£¬µ¥Î»£ºms */ void DelayMs(unsigned int ms) { unsigned char a,b,c; while(--ms) { for(c=1;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } } /* ÊýÂë¹ÜÏÔʾɨÃè */ void dig_scan(unsigned char *dat) { /* ¶¯Ì¬É¨Ãè´¦Àí */ switch(i) { case 0: { duanPore = tab_duan[dat[0]]; //ÏÔʾµÚ1λÊýÂë¹ÜÄÚÈÝ DIG1 = 0; break; } case 1: { duanPore = tab_duan[dat[1]]; //ÏÔʾµÚ2λÊýÂë¹ÜÄÚÈÝ DIG2 = 0; //ѡͨµÚ2λÊýÂë¹Ü break; } case 2: { duanPore = tab_duan[dat[2]]; //ÏÔʾµÚ3λÊýÂë¹ÜÄÚÈÝ DIG3 = 0; //ѡͨµÚ3λÊýÂë¹Ü break; } case 3: { duanPore = tab_duan[dat[3]]; //ÏÔʾµÚ4λÊýÂë¹ÜÄÚÈÝ DIG4 = 0; //ѡͨµÚ4λÊýÂë¹Ü break; } default: break; } DelayMs(5); //ɨÃèÑÓʱ10ms£¬¸ù¾Ýʵ¼ÊÇé¿öÊʵ±Ð޸ĸÄÑÓʱʱ¼ä DIG1 = 1; //ÏûÒþ DIG2 = 1; DIG3 = 1; DIG4 = 1; ++i; //ɨÃè±äÁ¿Ñ­»· if(i > 3) i = 0; } /* ¶ÀÁ¢°´¼üɨÃè */ unsigned char KeyScan(void) { if(KEY1 == 0) //Èç¹û°´¼ü1°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´¼ü¶¶¶¯ if(KEY1 == 0) //ÔÙÈ·ÈÏÒ»´Î°´¼ü°´Ï£¬±íʾµ½Õâ°´¼üÒѾ­Îȶ¨ÁË return 1; //Êä³ö°´¼üÖµ1 } if(KEY2 == 0) //Èç¹û°´¼ü2°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´¼ü¶¶¶¯ if(KEY2 == 0) //ÔÙÈ·ÈÏÒ»´Î°´¼ü°´Ï£¬±íʾµ½Õâ°´¼üÒѾ­Îȶ¨ÁË return 2; //Êä³ö°´¼üÖµ2 } if(KEY3 == 0) //Èç¹û°´¼ü3°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´¼ü¶¶¶¯ if(KEY3 == 0) //ÔÙÈ·ÈÏÒ»´Î°´¼ü°´Ï£¬±íʾµ½Õâ°´¼üÒѾ­Îȶ¨ÁË return 3; //Êä³ö°´¼üÖµ3 } if(KEY4 == 0) //Èç¹û°´¼ü4°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´¼ü¶¶¶¯ if(KEY4 == 0) //ÔÙÈ·ÈÏÒ»´Î°´¼ü°´Ï£¬±íʾµ½Õâ°´¼üÒѾ­Îȶ¨ÁË return 4; //Êä³ö°´¼üÖµ4 } if(KEY5 == 0) //Èç¹û°´¼ü5°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´¼ü¶¶¶¯ if(KEY5 == 0) //ÔÙÈ·ÈÏÒ»´Î°´¼ü°´Ï£¬±íʾµ½Õâ°´¼üÒѾ­Îȶ¨ÁË return 5; //Êä³ö°´¼üÖµ5 } if(KEY6 == 0) //Èç¹û°´¼ü6°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´¼ü¶¶¶¯ if(KEY6 == 0) //ÔÙÈ·ÈÏÒ»´Î°´¼ü°´Ï£¬±íʾµ½Õâ°´¼üÒѾ­Îȶ¨ÁË return 6; //Êä³ö°´¼üÖµ6 } if(KEY7 == 0) //Èç¹û°´¼ü7°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´¼ü¶¶¶¯ if(KEY7 == 0) //ÔÙÈ·ÈÏÒ»´Î°´¼ü°´Ï£¬±íʾµ½Õâ°´¼üÒѾ­Îȶ¨ÁË return 7; //Êä³ö°´¼üÖµ7 } if(KEY8 == 0) //Èç¹û°´¼ü8°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´¼ü¶¶¶¯ if(KEY8 == 0) //ÔÙÈ·ÈÏÒ»´Î°´¼ü°´Ï£¬±íʾµ½Õâ°´¼üÒѾ­Îȶ¨ÁË return 8; //Êä³ö°´¼üÖµ8 } return 0; //ÎÞ°´¼ü°´ÏÂÊä³ö0 } /* ¶¨Ê±Æ÷0³õʼ»¯ */ void InitTimer0(void) { TMOD = 0x01; //ÅäÖö¨Ê±Æ÷0Ϊ¹¤×÷ģʽ1£¬16λ¶¨Ê±Æ÷ TH0 = (65536 - 10000) / 256; //¶¨Ê±10ms TL0 = (65536 - 10000) % 256; EA = 1; //´ò¿ª×ÜÖÐ¶Ï ET0 = 1; //´ò¿ª¶¨Ê±Æ÷0ÖÐ¶Ï TR0 = 0; //ÉϵçĬÈϹرն¨Ê±Æ÷0 } /* ¶¨Ê±Æ÷0ÖжϷþÎñº¯Êý£¬10ms½øÒ»´ÎÖÐ¶Ï */ void Timer0Interrupt(void) interrupt 1 { TH0 = (65536 - 10000) / 256; //¶¨Ê±10ms£¬ÖØÐÂ×°ÔØ¼ÆÊýÖµ TL0 = (65536 - 10000) % 256; ++count; if(count > 100) //1sʱ¼ä¼ÆË㣺10ms * 100 = 1s { count = 0; //¼ÆÊýÖµÇåÁã --time; //µ¹¼ÆÊ±Ê±¼ä¼õÒ»´Î if(time <= 0) //Èç¹ûµ¹¼ÆÊ±½áÊø£¬Ôò¹Ø±Õ¶¨Ê±Æ÷0£¬Í£Ö¹µ¹¼ÆÊ±£¬²¢Éù¹â±¨¾¯ºÍËø¶¨¼üÅÌ { TR0 = 0; //¹Ø±Õ¶¨Ê±Æ÷0 BEEP = 1; //Éù¹â±¨¾¯ LED1 = 0; flag_lock = 0; //Ëø¶¨¼üÅÌ } } } /* ±¨¾¯º¯Êý */ void alarm(void) { BEEP = 1; //·äÃùÆ÷ÏìһϠDelayMs(300); //ÑÓʱ300ms BEEP = 0; } /* ʵÏÖÇÀ´ðÈÎÎñ */ void AnswerTask(void) { unsigned char key_val; //°´¼üÖµ»º´æ TR0 = 1; //Æô¶¯¶¨Ê±Æ÷0£¬¿ªÊ¼µ¹¼ÆÊ± while(1) { if(flag_lock == 1) { key_val = KeyScan(); //»ñÈ¡°´¼üÖµ switch(key_val) { case 1: { dat_buf[0] = key_val; //µÚ1λÊýÂë¹ÜÏÔʾ1ºÅ dat_buf[1] = 16; //ÏÔʾ'-' time = time2; //»Ø´ðµ¹¼ÆÊ±£¬Ñ¡Êֻشðʱ¼ä alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; //Ëø¶¨¼üÅÌ break; } case 2: { dat_buf[0] = key_val; //µÚ2λÊýÂë¹ÜÏÔʾ2ºÅ dat_buf[1] = 16; //ÏÔʾ'-' time = time2; //»Ø´ðµ¹¼ÆÊ±£¬Ñ¡Êֻشðʱ¼ä alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; break; } case 3: { dat_buf[0] = key_val; //µÚ3λÊýÂë¹ÜÏÔʾ3ºÅ dat_buf[1] = 16; //ÏÔʾ'-' time = time2; alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; break; } case 4: { dat_buf[0] = key_val; //µÚ4λÊýÂë¹ÜÏÔʾ4ºÅ dat_buf[1] = 16; //ÏÔʾ'-' time = time2; alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; break; } case 5: { dat_buf[0] = key_val; //µÚ5λÊýÂë¹ÜÏÔʾ5ºÅ dat_buf[1] = 16; //ÏÔʾ'-' time = time2; alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; break; } case 6: { dat_buf[0] = key_val; //µÚ6λÊýÂë¹ÜÏÔʾ6ºÅ dat_buf[1] = 16; //ÏÔʾ'-' time = time2; alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; break; } default: break; } } dat_buf[2] = time / 10; //È¡³öµ¹¼ÆÊ±µÄʮλÊý dat_buf[3] = time % 10; //È¡³öµ¹¼ÆÊ±µÄ¸öλÊý dig_scan(dat_buf); //ÊýÂë¹ÜÏÔʾÄÚÈÝ } } /* ÉèÖõ¹¼ÆÊ±Ê±¼ä */ void SetTime(void) { unsigned char mode = 0; //0£ºµ÷½ÚÇÀ´ðµ¹¼ÆÊ±£¬1£ºµ÷½Ú»Ø´ðµ¹¼ÆÊ±£¬2£ºÍ˳ö while(1) { if(KeyScan() == 8) //Èç¹ûÔٴΰ´ÏÂÉèÖüü£¬ÔòÍ˳öÉèÖù¦ÄÜ { alarm(); //·äÃùÆ÷ÏìÒ»Éù ++mode; if(mode >= 2) break; //Ìø³öµ±Ç°ËÀÑ­»· } if(KeyScan() == 7) //Èç¹û°´Ï¼Ӽü£¬½øÐе÷ʱ { alarm(); //·äÃùÆ÷ÏìÒ»Éù if(mode == 0) //µ÷½ÚÇÀ´ðµ¹¼ÆÊ± { ++time1; //µ¹¼ÆÊ±Ê±¼ä¼ÓÒ»´Î if(time1 > 30) //µ÷ʱ·¶Î§£º5s~30s time1 = 5; } if(mode == 1) //µ÷½Ú»Ø´ðµ¹¼ÆÊ± { ++time2; //µ¹¼ÆÊ±Ê±¼ä¼ÓÒ»´Î if(time2 > 30) //µ÷ʱ·¶Î§£º5s~30s time2 = 5; } } /* µ÷ʱÏÔʾ´¦Àí */ if(mode == 0) { dat_buf[0] = 16; //ÏÔʾ'-' dat_buf[1] = time1 / 10; //È¡³öµ¹¼ÆÊ±µÄʮλÊý dat_buf[2] = time1 % 10; //È¡³öµ¹¼ÆÊ±µÄ¸öλÊý dat_buf[3] = 16; //ÏÔʾ'-' } if(mode == 1) { dat_buf[0] = 18; //ÏÔʾ'=' dat_buf[1] = time2 / 10; //È¡³öµ¹¼ÆÊ±µÄʮλÊý dat_buf[2] = time2 % 10; //È¡³öµ¹¼ÆÊ±µÄ¸öλÊý dat_buf[3] = 18; //ÏÔʾ'=' } dig_scan(dat_buf); //ÊýÂë¹ÜÏÔʾÄÚÈÝ } time = time1; //»Øµ½Ö÷½çÃæÏÔʾÇÀ´ðµ¹¼ÆÊ± }写出一个这样的代码,主持人是1.0,时间调节是1.1,选手1.2-1.7,蜂鸣器是3.3,LED是3.4,数码管1234是2.0-2.3
09-19
根据增量式PID算法原理,完成main.c文件IncPIDInit()函数pid的初始化和 int32_t BLDC_SpdPIDCalc(int32_t NextPoint)函数的编写。条件:当误差小于等于正负3时,视为无误差。 #include "main.h" #include "math.h" #include "stm32f4xx_hal.h" #include "bldc/bsp_bldc.h" #include "key/bsp_key.h" #include "beep/bsp_beep.h" #include "HMI/bsp_usartx_HMI.h" /* ˽ÓÐÀàÐͶ¨Òå --------------------------------------------------------------*/ typedef struct { __IO int32_t SetPoint; //É趨Ŀ±ê Desired Value __IO long SumError; //Îó²îÀÛ¼Æ __IO float Proportion; //±ÈÀý³£Êý Proportional Const __IO float Integral; //»ý·Ö³£Êý Integral Const __IO float Derivative; //΢·Ö³£Êý Derivative Const __IO int LastError; //Error[-1] }PID_Typedef; /* ˽Óк궨Òå ----------------------------------------------------------------*/ //½«¸¡µãÊýxËÄÉáÎåÈëΪint32_t #define ROUND_TO_INT32(x) ((int32_t)(x)+0.5f)>=(x)? ((int32_t)(x)):((int32_t)(x)+1) #define WIN 8 #define P_DATA 0.035f // P²ÎÊý #define I_DATA 0.10f // I²ÎÊý #define D_DATA 0.0f // D²ÎÊý #define TARGET_SPEED 500 /* ˽ÓбäÁ¿ ------------------------------------------------------------------*/ __IO int32_t flag = 0; // µÃµ½WIN´ÎËÙ¶ÈÖµµÄ±êÖ¾ __IO int32_t start_flag = 0; // Æô¶¯±êÖ¾ __IO int32_t Avg_cnt = 0; // ƽ¾ùÖµ¼ÆÊý __IO float Avg_Speed[WIN]= {0};// ǰWIN´ÎµÄËÙ¶ÈÖµ static __IO int32_t BLDC_CaptureNumber = 0; // ÊäÈë²¶»ñÊý __IO PID_Typedef PID_BLDC; // BLDC PID¿ØÖƽṹÌå int32_t BLDC_SPEED_MAX = (3000); // µç»ú×î´óËÙ¶È//ĬÈÏ3000 int32_t BLDC_SPEED_MIN = (-3000); // µç»ú×î´óËÙ¶È//ĬÈÏ3000 uint32_t Time_CNT = 0; /* À©Õ¹±äÁ¿ ------------------------------------------------------------------*/ /* ˽Óк¯ÊýÔ­ÐÎ --------------------------------------------------------------*/ static void IncPIDInit(void) ; static float Avg_speed(float Speed); int32_t BLDC_SpdPIDCalc(int32_t NextPoint); void UpdateHMI_SM_PID_feedback(int32_t CaptureNumber,int32_t RPM); static void UpdateHMI_SM_PID_Param(PID_Typedef Param_Pos); void BLDC_SetTargetSpd(int32_t Spd); /* º¯ÊýÌå --------------------------------------------------------------------*/ /** * º¯Êý¹¦ÄÜ: ϵͳʱÖÓÅäÖà * ÊäÈë²ÎÊý: ÎÞ * ·µ »Ø Öµ: ÎÞ * ˵ Ã÷: ÎÞ */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; __HAL_RCC_PWR_CLK_ENABLE(); // ʹÄÜPWRʱÖÓ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);// ÉèÖõ÷ѹÆ÷Êä³öµçѹ¼¶±ð1 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;// Íⲿ¾§Õñ£¬8MHz RCC_OscInitStruct.HSEState = RCC_HSE_ON; // ´ò¿ªHSE RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; // ´ò¿ªPLL RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;// PLLʱÖÓÔ´Ñ¡ÔñHSE RCC_OscInitStruct.PLL.PLLM = 8; // 8·ÖƵMHz RCC_OscInitStruct.PLL.PLLN = 336; // 336±¶Æµ RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // 2·ÖƵ£¬µÃµ½168MHzÖ÷ʱÖÓ RCC_OscInitStruct.PLL.PLLQ = 7; // USB/SDIO/Ëæ»úÊý²úÉúÆ÷µÈµÄÖ÷PLL·ÖƵϵÊý HAL_RCC_OscConfig(&RCC_OscInitStruct); RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // ϵͳʱÖÓ£º168MHz RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHBʱÖÓ£º 168MHz RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; // APB1ʱÖÓ£º42MHz RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; // APB2ʱÖÓ£º84MHz HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); HAL_RCC_EnableCSS(); // ʹÄÜCSS¹¦ÄÜ£¬ÓÅÏÈʹÓÃÍⲿ¾§Õñ£¬ÄÚ²¿Ê±ÖÓԴΪ±¸Óà // HAL_RCC_GetHCLKFreq()/1000 1msÖжÏÒ»´Î // HAL_RCC_GetHCLKFreq()/100000 10usÖжÏÒ»´Î // HAL_RCC_GetHCLKFreq()/1000000 1usÖжÏÒ»´Î HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); // ÅäÖò¢Æô¶¯ÏµÍ³µÎ´ð¶¨Ê±Æ÷ /* ϵͳµÎ´ð¶¨Ê±Æ÷ʱÖÓÔ´ */ HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* ϵͳµÎ´ð¶¨Ê±Æ÷ÖжÏÓÅÏȼ¶ÅäÖà */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } /** * º¯Êý¹¦ÄÜ: Ö÷º¯Êý. * ÊäÈë²ÎÊý: ÎÞ * ·µ »Ø Öµ: ÎÞ * ˵ Ã÷: ÎÞ */ int main(void) { /* ¸´Î»ËùÓÐÍâÉ裬³õʼ»¯Flash½Ó¿ÚºÍϵͳµÎ´ð¶¨Ê±Æ÷ */ HAL_Init(); /* ÅäÖÃϵͳʱÖÓ */ SystemClock_Config(); /* ³õʼ»¯°´¼üÅäÖà */ KEY_GPIO_Init(); /* ³õʼ»¯´®¿ÚÅäÖà */ HMI_USARTx_Init(); /* ³õʼ»¯»ô¶û´«¸ÐÆ÷½Ó¿Ú */ HALL_TIMx_Init(); /* ³õʼ»¯¶¨Ê±Æ÷¸÷ͨµÀÊä³ö */ BLDCMOTOR_TIMx_Init(); /* Æô¶¯¶¨Ê±Æ÷ */ HAL_TIM_Base_Start(&htimx_BLDC); /* ³õʼ»¯PID²ÎÊý*/ IncPIDInit(); // UpdateHMI_SM_PID_Param(BLDC_sPID); /* ÔÚ·ÂÕæµÄʱºò½ûÖ¹¶¨Ê±Æ÷Êä³ö */ __HAL_DBGMCU_FREEZE_TIM8(); while (1) { if(Frame.PageID == PAGE_EX_PID) { switch(Frame.ObjID ) { /* ÉèÖÃÄ¿±êÖµ */ case EX_PID_NUM_POSTAR: BLDC_SetTargetSpd( Frame.Param.Init/10 ); Frame.ObjID = NONEOBJ; break; /* ÉèÖÃPID²ÎÊýP */ case EX_PID_NUM_POSP: PID_BLDC.Proportion = Frame.Param.Init/ 1000.0f; Frame.ObjID = NONEOBJ; break; /* ÉèÖÃPID²ÎÊýI */ case EX_PID_NUM_POSI: PID_BLDC.Integral = Frame.Param.Init/ 1000.0f; Frame.ObjID = NONEOBJ; break; /* ÉèÖÃPID²ÎÊýD */ case EX_PID_NUM_POSD: PID_BLDC.Derivative = Frame.Param.Init/ 1000.0f; Frame.ObjID = NONEOBJ; break; /* È·¶¨°´Å¥£¬Æô¶¯µç»ú */ case EX_PID_BTN_CONFIG: Enable_BLDC(); start_flag = 1; Frame.ObjID = NONEOBJ; break; /* Í£Ö¹°´Å¥£¬Í£Ö¹µç»ú */ case EX_PID_BTN_PAUSE: Disable_BLDC(); start_flag = 0; PID_BLDC.LastError = 0;// Error[-1] PID_BLDC.SumError = 0; Frame.ObjID = NONEOBJ; break; case EX_PID_BTN_UDATE:// ¶¨Ê±ÈÎÎñ£¬ÓÉ´®¿ÚÆÁ¾ö¶¨Ê±¼ä¼ä¸ô UpdateHMI_SM_PID_feedback(0,BLDC_CaptureNumber); UpdateHMI_SM_PID_Param(PID_BLDC); Frame.ObjID = NONEOBJ; break; } } /* ʹÄܵç»ú */ if(KEY1_StateRead() == KEY_DOWN) { Enable_BLDC(); start_flag = 1; } /* µç»úÍ£Ö¹ */ if(KEY2_StateRead() == KEY_DOWN) { Disable_BLDC(); start_flag = 0; } } } /** * º¯Êý¹¦ÄÜ: PID²ÎÊý³õʼ»¯ * ÊäÈë²ÎÊý: ÎÞ * ·µ »Ø Öµ: ÎÞ * ˵ Ã÷: ÎÞ */ void IncPIDInit(void) { PID_BLDC.LastError = 0; // Error[-1] PID_BLDC.Proportion = P_DATA; // ±ÈÀý³£Êý Proportional Const PID_BLDC.Integral = I_DATA; // »ý·Ö³£Êý Integral Const PID_BLDC.Derivative = D_DATA; // ΢·Ö³£Êý Derivative Const PID_BLDC.SetPoint = TARGET_SPEED;// É趨Ŀ±êDesired Value } /****************************** ÐÅÏ¢·´À¡º¯Êý **********************************/ ///** // * º¯Êý¹¦ÄÜ£º¸üд®¿ÚÆÁ½çÃæµÄPID²ÎÊýºÍÄ¿±êÖµ // * ÊäÈë²ÎÊý£ºParam_Pos,ËÙ¶È»·µÄPID½á¹¹ÌåÖ¸Õë // * ·µ »Ø Öµ£ºÎÞ // * ˵ Ã÷£º¸üеÄÊÇĬÈϵÄPID²ÎÊýºÍÄ¿±êÖµ // */ static void UpdateHMI_SM_PID_Param(PID_Typedef Param_Pos) { float tmp = 0; // /* ¸üд®¿ÚÆÁµÄPID²ÎÊý,PID²ÎÊý¶¼ÊÇ·Å´ó1000±¶ */ tmp = ( (float)Param_Pos.Proportion * 1000.0f ); HMI_value_setting("numPosP.val",tmp); tmp = ( (float)Param_Pos.Integral * 1000.0f ); HMI_value_setting("numPosI.val",tmp); tmp = ( (float)Param_Pos.Derivative * 1000.0f ); HMI_value_setting("numPosD.val",tmp); tmp = ( (float)Param_Pos.SetPoint ); HMI_string_setting("numPosTar.txt",tmp); } /** * º¯Êý¹¦ÄÜ£º¸üд®¿ÚÆÁ½çÃæµÄÊý¾Ý * ÊäÈë²ÎÊý£ºÎÞ * ·µ »Ø Öµ£ºÎÞ * ˵ Ã÷£º¸üÐÂλÖÃÖµºÍËÙ¶ÈÖµ */ void UpdateHMI_SM_PID_feedback(int32_t CaptureNumber,int32_t RPM) { HMI_string_setting("txtPosition.txt",0); HMI_string_setting("txtSpeed.txt",RPM); /* ·¢ËÍ·´À¡Öµ */ HMI_value_setting("vatmpReal.val",RPM/10); HMI_value_setting("vatmpTarget.val",ROUND_TO_INT32(PID_BLDC.SetPoint/10)); } /******************** Ëٶȱջ· PID ¿ØÖÆÉè¼Æ ***********************************/ /** * º¯Êý¹¦ÄÜ: »¬¶¯Â˲¨º¯Êý * ÊäÈë²ÎÊý: ËÙ¶ÈÖµ(r/min) * ·µ »Ø Öµ: Â˲¨ºóµÄËÙ¶ÈÖµ(r/min) * ˵ Ã÷: ¶ÔËÙ¶ÈÖµ½øÐ묶¯Â˲¨´¦Àí,´ó¸ÅÁ÷³Ì: * ¶ÔǰWIN´Î²ÉÑùµÄËÙ¶Èֵȡƽ¾ùÖµ */ float Avg_speed(float Speed) { int32_t i = 0; float Sum = 0; Avg_Speed[Avg_cnt] =Speed; Avg_cnt++; if(Avg_cnt == WIN) { Avg_cnt = 0; flag = 1; } /* ÔÚ²ÉÑù´ÎÊýÉÙÓÚn´ÎµÄÇé¿öϼÆËã¾ùÖµ */ if(flag == 0) { for(i = 0; i<Avg_cnt;i++) { Sum += Avg_Speed[i]; } Sum /= (i+1); } /* ÇóµÃǰn´ÎµÄƽ¾ùÖµ */ else { for(i = 0; i<WIN;i++) { Sum += Avg_Speed[i]; } Sum /= WIN; } return Sum; } /** * º¯Êý¹¦ÄÜ: ϵͳµÎ´ð¶¨Ê±Æ÷Öжϻص÷º¯Êý * ÊäÈë²ÎÊý: ÎÞ * ·µ »Ø Öµ: ÎÞ * ˵ Ã÷: ÿ·¢ÉúÒ»´ÎµÎ´ð¶¨Ê±Æ÷ÖжϽøÈë¸Ã»Øµ÷º¯ÊýÒ»´Î */ void HAL_SYSTICK_Callback() { float speed_rpm = 0; int32_t PID_Result = 0; Time_CNT++; /* 100ms ²ÉÑùÖÜÆÚ,¿ØÖÆÖÜÆÚ */ if(Time_CNT >= 100) { Time_CNT = 0; /* »ñÈ¡ËÙ¶ÈÖµ:Óɲ¶»ñµ½µÄÂö³åÊý³ýÒÔ×ܵÄʱ¼ä Pul/t */ /* BLDCMotorÊÇ4¶Ô¼«,ÐýתһȦÓÐ4¸öÂö³åÐźÅ,3ÏàUVWÐźÅÏß,¹²12¸öÂö³åÐźÅ, * ÿ¸öÂö³å±ßÑØ¼ÆÊýÒ»´Î,ËùÒÔBLDCMÐýתһȦ,¿ÉÒÔ²¶»ñµ½µÄ»ô¶ûÐźÅÊÇ24, * ¼ÆÊýÖµ¿ÉÒÔ¼ÆÊýµ½24.ÿ¸öÐźűßÑØ¶¼»á²¶»ñµ½½Ó¿Ú¶¨Ê±Æ÷µÄCCR1, * ÿ100ms¶ÁÈ¡²¶»ñµ½µÄʱ¼äºÍÂö³åÊý,¾Í¿ÉÒԵõ½µç»úµÄËÙ¶ÈÖµ. */ if(BLDCMotor.Hall_Period == 0)//±ÜÃâ³ýÊýΪ0 { speed_rpm = 0; } else /*Ëٶȵ¥Î»:RPM*/ speed_rpm = (((float)BLDCMotor.Hall_PulNum*60*HALL_TIM_FREQ) / ((float)BLDCMotor.Hall_Period*24)); //¶ÔËÙ¶ÈÖµ×ö»¬¶¯Â˲¨´¦Àí BLDC_CaptureNumber = (int32_t)Avg_speed(speed_rpm); BLDCMotor.Hall_Period = 0; BLDCMotor.Hall_PulNum = 0; if(start_flag == 1) { if(MotorDirction == MOTOR_DIR_CCW) BLDC_CaptureNumber = -BLDC_CaptureNumber; /* PID¿ØÖƼÆËã */ PID_Result = BLDC_SpdPIDCalc(BLDC_CaptureNumber); /* ·½ÏòÅж¨ */ if(PID_Result<0) { BLDCMotor.Dir = MOTOR_DIR_CCW; BLDCMotor.PWM_Duty = -PID_Result; } else { BLDCMotor.Dir = MOTOR_DIR_CW; BLDCMotor.PWM_Duty = PID_Result; } /* Õ¼¿Õ±ÈÏÞ¶¨ */ if(BLDCMotor.PWM_Duty >=(int32_t)(BLDCMOTOR_TIM_PERIOD - 100)) BLDCMotor.PWM_Duty = (int32_t)(BLDCMOTOR_TIM_PERIOD - 100); /* ¸ù¾Ýµ±Ç°Ô˶¯·½Ïò,Á¢¼´ÐÞ¸ÄÕ¼¿Õ±È */ BLDCMotor.uwStep = HallSensor_GetPinState(); if(MotorDirction == MOTOR_DIR_CW) { // ¸ù¾Ý˳Ðò±íµÄ¹æÂÉ CW = 7 - CCW; BLDCMotor.uwStep = (uint32_t)7 - BLDCMotor.uwStep; } /* ¸ù¾Ý·½ÏòÉ趨¶ÔӦͨµÀµÄÕ¼¿Õ±È */ switch(BLDCMotor.uwStep) { case 2: // AÏà case 6: __HAL_TIM_SET_COMPARE(&htimx_BLDC,TIM_CHANNEL_1,BLDCMotor.PWM_Duty); break; case 4: // BÏà case 5: __HAL_TIM_SET_COMPARE(&htimx_BLDC,TIM_CHANNEL_2,BLDCMotor.PWM_Duty); break; case 1: // CÏà case 3: __HAL_TIM_SET_COMPARE(&htimx_BLDC,TIM_CHANNEL_3,BLDCMotor.PWM_Duty); break; } /* µ±»»ÏòµÄʱºò£¬µç»ú¿ÉÄÜ»áÆô¶¯Ê§°Ü£¬ÕâÀïÖØÐÂÆô¶¯Ò»´Î */ if(MotorDirction != BLDCMotor.Dir) { Disable_BLDC(); Enable_BLDC(); } else if(speed_rpm == 0) { Disable_BLDC(); Enable_BLDC(); } } } } /** * º¯ÊýÃû³Æ£ºËٶȱջ·PID¿ØÖÆÉè¼Æ * ÊäÈë²ÎÊý£ºµ±Ç°¿ØÖÆÁ¿ * ·µ »Ø Öµ£ºÄ¿±ê¿ØÖÆÁ¿ * ˵ Ã÷£ºÎÞ */ int32_t BLDC_SpdPIDCalc(int32_t NextPoint) { } /** * º¯Êý¹¦ÄÜ: ÉèÖÃBLDCÄ¿±êËÙ¶È * ÊäÈë²ÎÊý: ÎÞ * ·µ »Ø Öµ: ÎÞ * ˵ Ã÷: ÏÞÖÆËÙ¶ÈÔÚãÐÖµ·¶Î§ÄÚ */ void BLDC_SetTargetSpd(int32_t Spd) { if(Spd >= BLDC_SPEED_MAX) Spd = BLDC_SPEED_MAX; if(Spd <= BLDC_SPEED_MIN) Spd = BLDC_SPEED_MIN; PID_BLDC.SetPoint = Spd; }
06-21
/** * @brief Ö´ÐÐ: WFIÖ¸Áî(Ö´ÐÐÍê¸ÃÖ¸Áî½øÈëµÍ¹¦ºÄ״̬, µÈ´ýÖжϻ½ÐÑ) * @param ÎÞ * @retval ÎÞ */ void sys_wfi_set(void) { __ASM volatile("wfi"); } /** * @brief ¹Ø±ÕËùÓÐÖжÏ(µ«ÊDz»°üÀ¨faultºÍNMIÖжÏ) * @param ÎÞ * @retval ÎÞ */ void sys_intx_disable(void) { __ASM volatile("cpsid i"); } /** * @brief ¿ªÆôËùÓÐÖÐ¶Ï * @param ÎÞ * @retval ÎÞ */ void sys_intx_enable(void) { __ASM volatile("cpsie i"); } /** * @brief ÉèÖÃÕ»¶¥µØÖ· * @note ×ó²àµÄºìX, ÊôÓÚMDKÎó±¨, ʵ¼ÊÊÇûÎÊÌâµÄ * @param addr: Õ»¶¥µØÖ· * @retval ÎÞ */ void sys_msr_msp(uint32_t addr) { __set_MSP(addr); /* ÉèÖÃÕ»¶¥µØÖ· */ } /** * @brief ½øÈë´ý»úģʽ * @param ÎÞ * @retval ÎÞ */ void sys_standby(void) { RCC->APB1ENR |= 1 << 28; /* ʹÄܵçԴʱÖÓ */ PWR->CSR |= 1 << 8; /* ÉèÖÃWKUPÓÃÓÚ»½ÐÑ */ PWR->CR |= 1 << 2; /* Çå³ýWKUP ±êÖ¾ */ PWR->CR |= 1 << 1; /* PDDS = 1, ÔÊÐí½øÈëÉî¶È˯Ãßģʽ(PDDS) */ SCB->SCR |= 1 << 2; /* ʹÄÜSLEEPDEEPλ (SYS->CTRL) */ sys_wfi_set(); /* Ö´ÐÐWFIÖ¸Áî, ½øÈë´ý»úģʽ */ } /** * @brief ϵͳÈí¸´Î» * @param ÎÞ * @retval ÎÞ */ void sys_soft_reset(void) { SCB->AIRCR = 0X05FA0000 | (uint32_t)0x04; } /** * @brief ʱÖÓÉèÖú¯Êý * @param plln: PLL±¶ÆµÏµÊý(PLL±¶Æµ), ȡֵ·¶Î§: 2~16 * @note * * PLLCLK: PLLÊä³öʱÖÓ * PLLSRC: PLLÊäÈëʱÖÓÆµÂÊ, ¿ÉÒÔÊÇ HSI/2, HSE/2, HSEµÈ, Ò»°ãÑ¡ÔñHSE. * SYSCLK: ϵͳʱÖÓ, ¿ÉÑ¡À´×Ô HSI/PLLCLK/HSE, Ò»°ãÑ¡ÔñÀ´×ÔPLLCLK * FCLK : Cortex M3ÄÚºËʱÖÓ, µÈÓÚHCLK * HCLK : AHB×ÜÏßʱÖÓ, À´×Ô SYSCLK µÄ·ÖƵ, ¿ÉÒÔÊÇ1...512·ÖƵ, Ò»°ã²»·ÖƵ * PCLK2 : APB2×ÜÏßʱÖÓ, À´×Ô HCLK µÄ·ÖƵ(×î´ó72Mhz), ¿ÉÒÔÊÇ1/2/4/8/16·ÖƵ, Ò»°ã²»·ÖƵ * PCLK1 : APB1×ÜÏßʱÖÓ, À´×Ô HCLK µÄ·ÖƵ(×î´ó36Mhz), ¿ÉÒÔÊÇ1/2/4/8/16·ÖƵ, Ò»°ã¶þ·ÖƵ * * PLLCLK = PLLSRC * plln; * FCLK = HCLK = SYSCLK; * PCLK2 = HCLK; * PCLK1 = HCLK / 2; * * ÎÒÃÇÒ»°ãÑ¡ÔñPLLSRCÀ´×ÔHSE, ¼´À´×ÔÍⲿ¾§Õñ. * µ±Íⲿ¾§ÕñΪ 8MµÄʱºò, ÍÆ¼ö: plln = 9, AHB²»·ÖƵ, µÃµ½: * PLLCLK = 8 * 9 = 72Mhz * FCLK = HCLK = SYSCLK = PLLCLK / 1 = 72Mhz * PCLK2 = HCLK = 72Mhz * PCLK1 = HCLK / 2 = 36Mhz * * ¹ØÓÚSTM32F103µÄPLL˵Ã÷Ïê¼û: <<STM32ÖÐÎIJο¼ÊÖ²á V10>>µÚÁùÕÂÏà¹ØÄÚÈÝ * * @retval ´íÎó´úÂë: 0, ³É¹¦; 1, HSE´íÎó; */ uint8_t sys_clock_set(uint32_t plln) { uint32_t retry = 0; uint8_t retval = 0; RCC->CR |= 0x00010000; /* Íⲿ¸ßËÙʱÖÓʹÄÜHSEON */ while (retry < 0XFFF0) { __nop(); /* ×¢Òâ, MDK5.29»òÒÔºó°æ±¾, ÔÚʹÄÜHSEONÒÔºó, Èç¹û²»¼ÓÒ»¶¨µÄÑÓʱ * ÔÙ¿ªÊ¼ÆäËûÅäÖÃ, »áµ¼Ö·ÂÕæÆ÷ÏÂÔØÍê´úÂë, ÑÓʱº¯ÊýÔËÐв»Õý³£µÄ bug * ÐèÒª°´¸´Î»°´¼ü, ÑÓʱ²Å»áÕý³£, ÔÚÕâÀï¼ÓÒ»¶¨µÄÑÓʱ, ¿ÉÒÔ½â¾öÕâ¸ö bug * ÕâÀï, ÎÒÃÇÉèÖõÄÑÓʱʱ¼ä, ÖÁÉÙÊÇ 0X8000 ¸ö nopʱ¼ä */ if (RCC->CR & (1 << 17) && retry > 0X8000) { break; } retry++; /* µÈ´ýHSE RDY */ } if (retry >= 0XFFF0) { retval = 1; /* HSEÎÞ·¨¾ÍÐ÷ */ } else { RCC->CFGR = 0X00000400; /* PCLK1 = HCLK / 2; PCLK2 = HCLK; HCLK = SYSCLK; */ plln -= 2; /* µÖÏû2¸öµ¥Î»(ÒòΪÊÇ´Ó2¿ªÊ¼µÄ, ÉèÖÃ0¾ÍÊÇ2) */ RCC->CFGR |= plln << 18; /* ÉèÖÃPLLÖµ 2~16 */ RCC->CFGR |= 1 << 16; /* PLLSRC = 1, Ñ¡Ôñ HSE ×÷Ϊ PLL ÊäÈëʱÖÓ */ /* FLASH_ACR¼Ä´æÆ÷µÄÃèÊöÏê¼û: <<STM32F10xxÉÁ´æ±à³ÌÊÖ²á>> */ FLASH->ACR = 1 << 4; /* PRFTBE = 1 ¿ªÆôԤȡ»º³åÇø */ FLASH->ACR |= 2 << 0; /* LATENCY[2:0] = 2 FLASHÁ½¸öµÈ´ýÖÜÆÚ */ RCC->CR |= 1 << 24; /* PLLON = 1, ʹÄÜPLL */ while (!(RCC->CR >> 25)); /* µÈ´ýPLLËø¶¨ */ RCC->CFGR |= 2 << 0; /* SW[1:0] = 2, Ñ¡ÔñPLLÊä³ö×÷ΪϵͳʱÖÓ */ while (((RCC->CFGR >> 2) & 0X03) != 2); /* µÈ´ýPLL×÷ΪϵͳʱÖÓÉèÖóɹ¦ */ } return retval; } /** * @brief ϵͳʱÖÓ³õʼ»¯º¯Êý * @param plln: PLL±¶ÆµÏµÊý(PLL±¶Æµ), ȡֵ·¶Î§: 2~16 * @retval ÎÞ */ void sys_stm32_clock_init(uint32_t plln) { RCC->APB1RSTR = 0x00000000; /* ¸´Î»½áÊø */ RCC->APB2RSTR = 0x00000000; RCC->AHBENR = 0x00000014; /* ˯ÃßģʽÉÁ´æºÍSRAMʱÖÓʹÄÜ.ÆäËû¹Ø±Õ */ RCC->APB2ENR = 0x00000000; /* ÍâÉèʱÖÓ¹Ø±Õ */ RCC->APB1ENR = 0x00000000; RCC->CR |= 0x00000001; /* ʹÄÜÄÚ²¿¸ßËÙʱÖÓHSION */ RCC->CFGR &= 0xF8FF0000; /* ¸´Î»SW[1:0], SWS[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], ADCPRE[1:0], MCO[2:0] */ RCC->CR &= 0xFEF6FFFF; /* ¸´Î»HSEON, CSSON, PLLON */ RCC->CR &= 0xFFFBFFFF; /* ¸´Î»HSEBYP */ RCC->CFGR &= 0xFF80FFFF; /* ¸´Î»PLLSRC, PLLXTPRE, PLLMUL[3:0] ºÍ USBPRE/OTGFSPRE */ RCC->CIR = 0x009F0000; /* ¹Ø±ÕËùÓÐRCCÖжϲ¢Çå³ýÖжϱêÖ¾ */ sys_clock_set(plln); /* ÉèÖÃʱÖÓ */ /* ÅäÖÃÖжÏÏòÁ¿Æ«ÒÆ */ #ifdef VECT_TAB_RAM sys_nvic_set_vector_table(SRAM_BASE, 0x0); #else sys_nvic_set_vector_table(FLASH_BASE, 0x0); #endif }
07-22
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值