历史上的今天
返回首页

历史上的今天

今天是:2024年10月14日(星期一)

正在发生

2019年10月14日 | STM32 PWM实现精确输出脉冲数控制电机

2019-10-14 来源:eefocus

精确输出脉冲数控制电机,使用stm32单片机的pwm功能实现,精确控制脉冲个数


单片机源程序如下:


#include

#include "sys.h"

#include "usart.h"                

#include "delay.h"        

#include "led.h" 

#include "exti.h"

#include "key.h"

#define MOTOR_DIR PBout(11)// PB11

#define MOTOR_EN  PEout(15)// PE15

u16 i;

u16 fre;

u16        TIM5CH1_CAPTURE_VAL;        //输入捕获值

u16 PUL_CNT;

void Motor_Set()

{

        RCC->APB2ENR|=1<<3;    //使能PORTB时钟                    

        GPIOB->CRH&=0XFFFF0FFF; 

        GPIOB->CRH|=0X00003000;  //PB11 推挽输出            

    GPIOB->ODR|=(1<<11);      //PB11 输出高

        RCC->APB2ENR|=1<<6;    //使能PORTE时钟                    

        GPIOE->CRH&=0X0FFFFFFF; 

        GPIOE->CRH|=0X30000000;  //PE15 推挽输出            

    GPIOE->ODR|=(1<<15);      //PE15 输出高

        MOTOR_EN=0; //不使能

}          

void Timer3_Init(u16 arr,u16 psc) 

        RCC->APB2ENR|=1<<2;    //使能PORTA时钟 

        RCC->APB2ENR|=1<<3;    //使能PORTB时钟 

        RCC->APB2ENR|=1<<5;    //使能PORTD时钟 

        GPIOB->CRL&=0XFF0FFFFF;        //PB5输出

        GPIOB->CRL|=0X00B00000;        //复用功能输出           


        GPIOA->CRL&=0x00ffffff; 

        GPIOA->CRL|=0xBB000000; 

        GPIOA->ODR|=3<<6; 

        GPIOB->CRL&=0xffffff00;

        GPIOB->CRL|=0x000000BB; 

        GPIOB->ODR|=3; 

        RCC->APB1ENR|=1<<1;//TIM3时钟使能 

        TIM3->CR1|=1<<4;//向下计数 

        TIM3->CCMR1=0x6868;//通道1、2PWM模式1,预装载使能 

        TIM3->CCMR2=0x6868;//通道3、4PWM模式1,预装载使能 

        

        TIM3->CCR1=100; 

        TIM3->CCR2=200; 

        TIM3->CCR3=200; 

        TIM3->CCR4=100; //4k->250

        TIM3->ARR=arr;  //设定计数器自动重装值//刚好0.1ms    

        TIM3->PSC=psc;  //预分频器7200,得到10Khz的计数时钟

//        TIM3->ARR=1000;  //设定计数器自动重装值  1000=1ms                  10000=10ms(1~10ms对应1000~100hz)

//        TIM3->PSC=72;  //预分频器72,得到1Mhz的计数时钟 

        TIM3->CCER=0X1111;//打开四个通道,允许输出,有效电平为高 

        TIM3->CR1|=1<<7; 

        TIM3->EGR|=1; 

                //这两个东东要同时设置才可以使用中断

        TIM3->DIER|=1<<0;   //允许更新中断                                

        TIM3->DIER|=1<<6;   //允许触发中断

        TIM3->CR1|=0x01;    //使能定时器3  

}


void Timer4_Init(u16 arr,u16 psc)

{

        RCC->APB1ENR|=1<<2;//TIM4时钟使能    

        TIM4->ARR=arr;  //设定计数器自动重装值//刚好1ms    

        TIM4->PSC=psc;  //预分频器7200,得到10Khz的计数时钟

        //这两个东东要同时设置才可以使用中断

        TIM4->DIER|=1<<0;   //允许更新中断    

        TIM4->DIER|=1<<6;   //允许触发中断

               

        TIM4->CR1|=0x01;    //使能定时器4

        MY_NVIC_Init(1,3,TIM4_IRQChannel,2);//抢占1,子优先级3,组2          

}

void TIM4_IRQHandler(void)

{

        if(TIM4->SR&0X0001)//溢出中断

        {

                LED2=!LED2;                                     

        }       

        TIM4->SR&=~(1<<0);//清除中断标志位   

}

void Timer2_Init(u16 arr,u16 psc)

{

        RCC->APB1ENR|=1<<0;//TIM4时钟使能    

        TIM2->ARR=arr;  //设定计数器自动重装值//刚好1ms    

        TIM2->PSC=psc;  //预分频器7200,得到10Khz的计数时钟

        //这两个东东要同时设置才可以使用中断

        TIM2->DIER|=1<<0;   //允许更新中断    

        TIM2->DIER|=1<<6;   //允许触发中断

               

        TIM2->CR1&=0xfe;    //不使能定时器2

//        TIM2->CR1|=0x01;    //使能定时器2

        MY_NVIC_Init(1,3,TIM2_IRQChannel,2);//抢占1,子优先级3,组2        

}

void TIM2_IRQHandler(void)        //1s到

{

        if(TIM2->SR&0X0001)//溢出中断

        {

                EXTI->IMR &=~(1<<0); //关闭外部中断

                TIM2->CR1&=0xfe;    //不使能定时器2

                fre=TIM5CH1_CAPTURE_VAL/2; //计算出频率

                printf("%d rn",fre);

                TIM5CH1_CAPTURE_VAL=0; 

                LED1=!LED1;        

                EXTI->IMR |= (1<<0); //打开外部中断                                         

        }       

        TIM2->SR&=~(1<<0);//清除中断标志位   

}

//定时器3中断服务程序

void TIM3_IRQHandler(void)

{                                                                   

        if(TIM3->SR&0X0001)//溢出中断

        {        

                                                                                                                        

        }                                   

        TIM3->SR&=~(1<<0);//清除中断标志位             

}

                                

//外部中断0服务程序

void EXTI0_IRQHandler(void)

{

        TIM2->CR1|=0x01;    //使能定时器2

        TIM5CH1_CAPTURE_VAL ++;

        PUL_CNT ++;

        if(TIM5CH1_CAPTURE_VAL%500==0)

        LED3 = !LED3;         

        EXTI->PR=1<<0;  //清除LINE0上的中断标志位  

}

                                        

int main(void)

{        

        u16 Motor_cnt;

        Stm32_Clock_Init(9); //系统时钟设置

        delay_init(72);             //延时初始化

        uart_init(72,115200);  //串口初始化 

        LED_Init();                           //初始化与LED连接的硬件接口

        KEY_Init();                        //按键

        Timer3_Init(1000-1,72-1);                //1MHZ 周期1MS  定时器3产生PWM

        EXTIX_Init();                //外部中断

        Motor_Set();                //电机参数设置

        Timer4_Init(2000,7200);


        Timer2_Init(10000-1,7200-1);


        LED1=0;TIM3->CR1&=0xfe; 

           while(1)

        {

                //delay_ms(100);

推荐阅读

史海拾趣

ADATA公司的发展小趣事

ADATA科技成立于2001年,是一家专注于提供存储解决方案的公司,以下是该公司发展的五个相关故事:

  1. 公司成立与初期发展: ADATA科技成立于2001年,总部位于台湾新北市,最初致力于生产和销售DRAM模块。随着存储技术的不断发展,公司逐渐扩展了业务范围,涵盖了闪存产品、固态硬盘、移动存储设备等多个领域。

  2. 技术创新与产品推出: ADATA科技在存储领域进行了持续的技术创新,并推出了一系列具有竞争力的产品。公司不断提升产品性能、降低成本,并注重产品的设计和用户体验。除了传统的DRAM模块,公司还推出了闪存卡、固态硬盘、移动硬盘等产品,满足了不同客户和市场的需求。

  3. 市场拓展与国际化发展: ADATA科技积极拓展国内外市场,并逐步实现了国际化发展。公司产品远销全球各地,与全球范围内的主要零售商、电子产品制造商建立了合作关系。通过与合作伙伴的紧密合作,公司产品在国际市场上得到了广泛认可和好评。

  4. 品牌建设与市场影响力: ADATA科技通过持续的品牌建设活动,不断提升了在存储领域的市场影响力。公司参加各类行业展会、展示活动,并投入大量资源进行市场推广和宣传。同时,公司还与体育、文化等领域开展赞助活动,提升品牌知名度和美誉度。

  5. 未来展望与持续发展: 作为一家专注于存储解决方案的企业,ADATA科技将继续致力于技术创新和产品开发。公司将不断改进现有产品,推出更多性能更好、功能更丰富的存储产品,以满足不断变化的市场需求。同时,公司还将继续拓展国际市场,加强与合作伙伴的合作,实现业务的持续增长和发展。

Dongguan City Niuhang Electronics Co.LTD公司的发展小趣事

Dongguan City Niuhang Electronics Co.LTD成立于2012年,当时的中国电子行业正处于快速发展期。创始人李小芹凭借对半导体技术的深刻理解和市场需求的敏锐洞察,决定专注于二极管、桥式整流器等产品的研发与封装。公司成立初期,面临着资金短缺、技术储备不足等挑战,但李小芹凭借坚定的信念和不懈的努力,带领团队攻克了一个又一个技术难关,逐步在市场上树立了良好的口碑。

GE Industrial Solutions公司的发展小趣事
当输入信号过大时,运放可能进入饱和状态,导致输出信号失真。解决方法包括选择合适的运放增益和输入电阻,以及加入限幅电路。
GD Rectifiers Ltd公司的发展小趣事

面对电子行业日益激烈的市场竞争,GD Rectifiers Ltd通过并购整合的方式加速了自身的发展步伐。公司精心挑选了几家在细分领域具有领先地位的竞争对手,通过友好协商和合理估值,成功完成了对这些企业的并购。并购后,GD Rectifiers Ltd充分利用被并购企业的技术优势和市场份额,实现了产品线的进一步丰富和销售渠道的拓展。同时,公司还加强了对内部资源的整合和优化,提高了整体运营效率和市场竞争力。

Enterpoint公司的发展小趣事

在Enterpoint公司的发展过程中,他们始终将客户服务放在首位。公司建立了一套完善的客户服务体系,为客户提供从产品咨询、技术支持到售后服务的全方位支持。这种对客户的关注和投入,不仅赢得了客户的信任和好评,也为公司的品牌建设打下了坚实的基础。

岑科(CENKER)公司的发展小趣事

为了实现更长远的发展,岑科在2004年决定进军生产制造领域。公司在深圳和广西设立了工厂,开始了自主生产制造之路。在这一过程中,岑科严格控制生产流程,灵活配置资源,并建立了严格的质量管理体系,以确保产品的高水平交付。通过自主研发和创新,岑科逐渐在生产制造领域取得了显著的成果,产品线不断扩展,市场份额也逐渐增加。

问答坊 | AI 解惑

看看人家做的调频发射机

用双面板做的,采用单片机+锁相环控制+C2053功率管输出,频率非常稳定。 可以用按键调节发射频率,电子音量等 频率设置步进0.1MHZ 或1MHZ可以工作在88-108MHZ 调频段,升级软件可以在70-120MHZ工作 输出能驱动小灯泡发光,功率最大1W 该 ...…

查看全部问答>

时序约束的问题

输入时钟为ddr_ck/ddr_ckn,经过dcm产生270度的相移,输出为clk1X。clk1X作为整个系统的工作时钟。要求ddr_ck/ddr_ckn在400~667MHz之间。在不做时序约束的条件下,系统的最高工作频率为365.658MHz,不满足要求。下面是综合报告的相关结果:======== ...…

查看全部问答>

Quartus2的FPGACPLD设计

为什么不能正常下载?…

查看全部问答>

关于USB总线与PCI总线

在网上看到关于USB总线的资料: USB是“Universal Serial Bus”的缩写,意思是“通用串行总线”。 但请注意,这不是一种新的总线标准,而是电脑系统接驳外围设备(如键盘、鼠标、打印机等)的输入/输出接口标准。现在电脑系统接驳外围设备的接口并 ...…

查看全部问答>

protel dxp指导教程pdf

 protel dxp指导教程pdf…

查看全部问答>

C语言轻松入门---------献给初学者

  献给那些没学过或是刚接触C语言的好学同志。   要是看不懂的,可以提出来,大家一起讨论进步!!!    …

查看全部问答>

关于stm32的TIM

这两天在捣鼓stm32的TIMx,不是TIM1,看了很多的文章,自己也尝试了很多程序,貌似还是没有看到效果,比如led灯被点亮,或者输出波形,感觉市面上的材料大多都有问题,或者只适合作者自己,没有通用性,求懂TIM的人留言,可以直接贴代码,加些注释 ...…

查看全部问答>

求助:工作方向选择问题

我刚本科毕业半年,在一间小公司做硬件开发,做着做着觉得自己手比较笨,对于焊接那些小东西感到很吃力,而且也不喜欢做这些,但是对编写相关的硬件代码却有很浓厚的兴趣,特别是跟linux系统相关的代码。但是自己却没多少linux基础,我想知道有没有 ...…

查看全部问答>

新手求IAR打开文件错误问题,cc2530

Error[e12]: Unable to open file \'C:\\Program Files\\IAR Systems\\Embedded Workbench 6.0 Evaluation_3\\8051\\config\\ devices\\derivatives\\lnk51ew_.xcl\'…

查看全部问答>

提问+beaglebone可以像DSP2818一样通过maltab来编程不?

beaglebone可以像DSP2818一样通过maltab来编程不?没用过,看论坛里有这个活动! …

查看全部问答>