完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
推荐课程:
张飞软硬开源:基于STM32的BLDC直流无刷电机驱动器(视频+硬件) http://url.elecfans.com/u/73ad899cfd 串口接收,控制步进电机步数,带一个限位开关,采用定时器级联控制,第一个定时器控制PWM频率,第二个控制脉冲个数. 主程序: #include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "usart.h" #include "timer.h" /************************************************ ************************************************/ int main(void) { u16 i,t,len,j; uint8_t RESET[8]={0X01, 0x06, 0x07,0xD0, 0x00, 0x01, 0x48, 0x87}; delay_init(); //ÑÓʱº¯Êý³õʼ»¯ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶ uart_init(9600); //´®¿Ú³õʼ»¯Îª9600 LED_Init(); //LED¶Ë¿Ú³õʼ»¯ EXTI2_Init(); while(1) { if(USART_RX_STA&0x8000) { len=USART_RX_STA&0x3fff;//µÃµ½´Ë´Î½ÓÊÕµ½µÄÊý¾Ý³¤¶È //printf("rnÄú·¢Ë͵ÄÏûϢΪ:rnrn"); if(USART_RX_BUF[0]==0xF5) { switch(USART_RX_BUF[1]) { case 0x20 : for(t=0;t<8;t++) { USART_SendData(USART1,RESET[t]);//Ïò´®¿Ú1·¢ËÍÊý¾Ý while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//µÈ´ý·¢ËͽáÊø } GPIO_SetBits(GPIOB,GPIO_Pin_15);//ENʹÄÜ¶Ë GPIO_SetBits(GPIOB,GPIO_Pin_9);//DIR·½Ïò Pulse_output(5000,USART_RX_BUF[2]*0XFF+USART_RX_BUF[3]+1);//PWM1ƵÂÊ=72000000/(5000*72)=1000000/5000=200hz,Õ¼¿Õ±ÈΪ50% break; case 0x21 : for(t=0;t<8;t++) { USART_SendData(USART1, RESET[t]);//Ïò´®¿Ú1·¢ËÍÊý¾Ý while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//µÈ´ý·¢ËͽáÊø } GPIO_SetBits(GPIOB,GPIO_Pin_15);//ENʹÄÜ¶Ë GPIO_ResetBits(GPIOB,GPIO_Pin_9);//DIR·½Ïò Pulse_output(5000,USART_RX_BUF[2]*0XFF+USART_RX_BUF[3]+1);//PWM1ƵÂÊ=72000000/(5000*72)=1000000/5000=200hz,Õ¼¿Õ±ÈΪ50% break; case 0x22 : GPIO_ResetBits(GPIOB,GPIO_Pin_15); break; } } //printf("rnrn");//²åÈë»»ÐÐ USART_RX_STA=0; for(i=0;i } /* else { times++; if(times%200==0)printf("ÇëÊäÈëÊý¾Ý,ÒԻسµ¼ü½áÊørn"); if(times%30==0)LED0=!LED0;//ÉÁ˸LED,ÌáʾϵͳÕýÔÚÔËÐÐ. delay_ms(10); }*/ } } 定时器和外部中断: #include "timer.h" #include "led.h" #include "usart.h" #include "delay.h" ////////////////////////////////////////////////////////////////////////////////// //arr£º×Ô¶¯ÖØ×°Öµ¡£ //psc£ºÊ±ÖÓÔ¤·ÖƵÊý //ÕâÀïʹÓõÄÊǶ¨Ê±Æ÷1ΪPWMÖ÷ģʽÊä³öPWMÐźš£¶¨Ê±Æ÷2Ϊ´Óģʽ¿ØÖƸöÊý void TIM2_config(uint32_t PulseNum) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructure.TIM_Period = PulseNum-1; TIM_TimeBaseStructure.TIM_Prescaler =0; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_SelectInputTrigger(TIM2, TIM_TS_ITR0); //TIM_InternalClockConfig(TIM3); TIM2->SMCR|=0x07; //TIM_ITRxExternalClockConfig(TIM2, TIM_TS_ITR0); //TIM_ARRPreloadConfig(TIM3, ENABLE); TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); TIM_CtrlPWMOutputs(TIM1, DISABLE); TIM_Cmd(TIM1, DISABLE); TIM_Cmd(TIM2, DISABLE); TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE); } } void Pulse_output(u32 arr,u32 PulseNum) { TIM2_config(PulseNum); TIM_Cmd(TIM2, ENABLE); TIM_ClearITPendingBit(TIM2,TIM_IT_Update); TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); TIM1_PWM_Init(arr,71); TIM_Cmd(TIM1, ENABLE); TIM_CtrlPWMOutputs(TIM1, ENABLE); } /* void TIM3_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //ʱÖÓʹÄÜ TIM_TimeBaseStructure.TIM_Period = arr; //ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ ¼ÆÊýµ½5000Ϊ500ms TIM_TimeBaseStructure.TIM_Prescaler =psc; //ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓƵÂʳýÊýµÄÔ¤·ÖƵֵ 10KhzµÄ¼ÆÊýƵÂÊ TIM_TimeBaseStructure.TIM_ClockDivision = 0; //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMÏòÉϼÆÊýģʽ TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //¸ù¾ÝTIM_TimeBaseInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î» TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //ʹÄÜÖ¸¶¨µÄTIM3ÖжÏ,ÔÊÐí¸üÐÂÖÐ¶Ï NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3ÖÐ¶Ï NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //ÏÈÕ¼ÓÅÏȼ¶0¼¶ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //´ÓÓÅÏȼ¶3¼¶ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀ±»Ê¹ÄÜ NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝNVIC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèNVIC¼Ä´æÆ÷ TIM_Cmd(TIM3, ENABLE); //ʹÄÜTIMxÍâÉè } //¶¨Ê±Æ÷3ÖжϷþÎñ³ÌÐò void TIM3_IRQHandler(void) //TIM3ÖÐ¶Ï { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //¼ì²éÖ¸¶¨µÄTIMÖжϷ¢ÉúÓë·ñ:TIM ÖжÏÔ´ { LED1=!LED1; TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //Çå³ýTIMxµÄÖжϴý´¦Àíλ:TIM ÖжÏÔ´ } } */ //TIM3 PWM²¿·Ö³õʼ»¯ //PWMÊä³ö³õʼ»¯ //arr£º×Ô¶¯ÖØ×°Öµ //psc£ºÊ±ÖÓÔ¤·ÖƵÊý void TIM1_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_TIM1 , ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //TIM1_CH4 PA11 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = arr-1; TIM_TimeBaseStructure.TIM_Prescaler =psc; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = arr/2-1; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OC4Init(TIM1, &TIM_OCInitStructure); TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable); TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update); TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM1, ENABLE); } void EXTI2_Init(void) { GPIO_InitTypeDef GPIO_InitStructure2; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //ʹÄܸ´Óù¦ÄÜʱÖÓ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //GPIOA.2 ¸´ÓÃÅäÖà GPIO_InitStructure2.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure2.GPIO_Mode = GPIO_Mode_IPU; //ÉÏÀÊäÈë GPIO_Init(GPIOA, &GPIO_InitStructure2); //GPIOA.2 ÖжÏÏßÒÔ¼°Öжϳõʼ»¯ÅäÖà ϽµÑØ´¥·¢ GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource2); EXTI_InitStructure.EXTI_Line=EXTI_Line2; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); //¸ù¾ÝEXTI_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèEXTI¼Ä´æÆ÷ NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //ʹÄÜ°´¼üWK_UPËùÔÚµÄÍⲿÖжÏͨµÀ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //ÇÀÕ¼ÓÅÏȼ¶3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //×ÓÓÅÏȼ¶1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //ʹÄÜÍⲿÖжÏͨµÀ NVIC_Init(&NVIC_InitStructure); } //ÍⲿÖжÏ0·þÎñ³ÌÐò void EXTI2_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line2)!=RESET) { GPIO_ResetBits(GPIOB,GPIO_Pin_15); EXTI_ClearITPendingBit(EXTI_Line2); } } |
|
相关推荐
|
|
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-3-28 17:39 , Processed in 0.458173 second(s), Total 65, Slave 46 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 深圳华秋电子有限公司
电子发烧友 (电路图) 粤公网安备 44030402000349 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号