完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在做步进电机的控制时,需要用到pwm脉冲计数,我想的是pwm输出的同时开启溢出中断,在服务函数里计算脉冲数。现在遇到的问题是,定时器中断和pwm输出 这两个代码分开的时候,两个都能正常运行,但是合在一起的时候就触发不了中断了。用的寄存器
|
|
相关推荐
13个回答
|
|
终于还是把程序调试完了,之前步进电机驱动的ena端线松了,导致实验现象与程序不符,又由于没有J-link,只能通过在程序中加LED灯来调试,就出现上面源程序的中断函数里有小灯和延时函数。花费了大量的时间来调试(这个故事告诉我们 ,拥有一个J-link是多么的美好)
。简单总结一下,网上大多使用的是高级定时器来数脉冲,但是这次用到的板子上没有引出高级定时器,我就想通过通用定时器的溢出中断来计数脉冲,就目前来看,电机能按预期工作,尽管程序比较简单,但是对我这个菜鸟来说,能孤立完成已经很开心了 |
|
|
|
void TIM3_PWM_Init(u16 arr,u16 psc)
{ //´Ë²¿·ÖÐèÊÖ¶¯ÐÞ¸ÄIO¿ÚÉèÖà RCC->APB1ENR|=1<<1; //TIM3ʱÖÓʹÄÜ RCC->APB2ENR|=1<<3; //ʹÄÜPORTBʱÖÓ // GPIOB->CRL&=0XFF0FFFFF; //PB5Êä³ö // GPIOB->CRL|=0X00B00000; //¸´Óù¦ÄÜÊä³ö RCC->APB2ENR|=1<<2; //ʹÄÜPORTAʱÖÓ GPIOA->CRL&=0X0FFFFFFF; //PA7Êä³ö GPIOA->CRL|=0XB0000000; //¸´Óù¦ÄÜÊä³ö RCC->APB2ENR|=1<<0; //¿ªÆô¸¨ÖúʱÖÓ // AFIO->MAPR&=0XFFFFF3FF; //Çå³ýMAPRµÄ[11:10] // AFIO->MAPR|=0<<10; //²¿·ÖÖØÓ³Ïñ,TIM3_CH2->PA7 TIM3->ARR=arr; //É趨¼ÆÊýÆ÷×Ô¶¯ÖØ×°Öµ TIM3->PSC=psc; //Ô¤·ÖƵÆ÷²»·ÖƵ TIM3->CCMR1|=7<<12; //CH2 PWM2ģʽ TIM3->CCMR1|=1<<11; //CH2ԤװÔØʹÄÜ TIM3->CCER|=3<<4; //OC2 Êä³öʹÄÜ ,Êä³ö¼«ÐÔΪµÍ TIM3->DIER|=1<<0; //ÔÊÐí¸üÐÂÖÐ¶Ï TIM3->DIER|=1<<6; //ÔÊÐí´¥·¢ÖÐ¶Ï TIM3->DIER|=1<<2; //ÔÊÐí±È½Ï/²¶»ñ2ÖÐ¶Ï MY_NVIC_Init(1,3,TIM3_IRQn,2);//ÇÀÕ¼1£¬×ÓÓÅÏȼ¶3£¬×é2 //TIM3->CCER|=1<<4; //OC2 Êä³öʹÄÜ £¬ Êä³ö¼«ÐÔΪ¸ß TIM3->CR1=0x0080; //ARPEʹÄÜ TIM3->CR1|=0x03; //ʹÄܶ¨Ê±Æ÷3 £¬²¢Ö»ÓÐÒç³ö´¥·¢ÖÐ¶Ï } |
|
|
|
void TIM3_IRQHandler(void)
{ LED1=1; delay_ms(500); if(TIM3->SR>>2&0X0001)//Òç³öÖÐ¶Ï { pluse=pluse+1; } TIM3->SR&=~(1<<2);//Çå³ýÖжϱê־λ } |
|
|
|
首先,中断里面用delay_ms(500);,牛逼。。。
|
|
|
|
代码中最大的问题中断里延时,推荐一种高效方法,资源够用的情况下,可以考虑结合DMA精确脉冲控制,不用频繁进入中断。
|
|
|
|
void TIM3_PWM_Init(u16 arr,u16 psc)
{ //´Ë²¿·ÖÐèÊÖ¶¯ÐÞ¸ÄIO¿ÚÉèÖà RCC->APB1ENR|=1<<1; //TIM3ʱÖÓʹÄÜ RCC->APB2ENR|=1<<3; //ʹÄÜPORTBʱÖÓ // GPIOB->CRL&=0XFF0FFFFF; //PB5Êä³ö // GPIOB->CRL|=0X00B00000; //¸´Óù¦ÄÜÊä³ö RCC->APB2ENR|=1<<2; //ʹÄÜPORTAʱÖÓ GPIOA->CRL&=0X0FFFFFFF; //PA7Êä³ö GPIOA->CRL|=0XB0000000; //¸´Óù¦ÄÜÊä³ö RCC->APB2ENR|=1<<0; //¿ªÆô¸¨ÖúʱÖÓ // AFIO->MAPR&=0XFFFFF3FF; //Çå³ýMAPRµÄ[11:10] // AFIO->MAPR|=0<<10; //²¿·ÖÖØÓ³Ïñ,TIM3_CH2->PA7 TIM3->ARR=arr; //É趨¼ÆÊýÆ÷×Ô¶¯ÖØ×°Öµ TIM3->PSC=psc; //Ô¤·ÖƵÆ÷²»·ÖƵ TIM3->CCMR1|=7<<12; //CH2 PWM2ģʽ TIM3->CCMR1|=1<<11; //CH2ԤװÔØʹÄÜ TIM3->CCER|=3<<4; //OC2 Êä³öʹÄÜ ,Êä³ö¼«ÐÔΪµÍ TIM3->DIER|=1<<0; //ÔÊÐí¸üÐÂÖÐ¶Ï TIM3->DIER|=1<<6; //ÔÊÐí´¥·¢ÖÐ¶Ï TIM3->DIER|=1<<2; //ÔÊÐí±È½Ï/²¶»ñ2ÖÐ¶Ï //TIM3->CCER|=1<<4; //OC2 Êä³öʹÄÜ £¬ Êä³ö¼«ÐÔΪ¸ß TIM3->CR1=0x0080; //ARPEʹÄÜ TIM3->CR1|=0x0005; //ʹÄܶ¨Ê±Æ÷3 £¬²¢Ö»ÓÐÒç³ö´¥·¢ÖÐ¶Ï MY_NVIC_Init(1,3,TIM3_IRQn,2);//ÇÀÕ¼1£¬×ÓÓÅÏȼ¶3£¬×é2 } |
|
|
|
extern u16 pluse;
void TIM3_IRQHandler(void) { if(TIM3->SR&0X0001)//Òç³öÖÐ¶Ï { pluse++; // if(pluse>6400) // ENA=1; } TIM3->SR&=~(1<<0);//Çå³ýÖжϱê־λ } |
|
|
|
嗯嗯,学到DMA的时候试试,谢谢 |
|
|
|
|
|
|
|
|
|
|
|
配置有问题了哦
|
|
|
|
加油了哦的
|
|
|
|
好好努力看看手册
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
hal库中i2c卡死在HAL_I2C_Master_Transmit
942 浏览 1 评论
LL库F030进行3个串口收发,2个串口为232,一个为485,长时间后,会出现串口1停止运行,另外两个正常,只有重启复原
1440 浏览 1 评论
519 浏览 0 评论
1040 浏览 0 评论
1181 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-4 07:02 , Processed in 0.846212 second(s), Total 100, Slave 82 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号