历史上的今天
返回首页

历史上的今天

今天是:2024年08月27日(星期二)

正在发生

2021年08月27日 | STM32学习笔记-PWM波形输出

2021-08-27 来源:eefocus

调试芯片:STM32F103C8T6


外部晶振:8MHz


功能介绍:使用Timer3实现两路(可四路)PWM波形的输出


代码如下:


初始化:系统时钟初始化,GPIO端口初始化,Timer初始化


系统时钟初始化:


/* 配置系统时钟为72M */ 

SystemInit(); 


GPIO端口初始化:


/****************************************************************

 * 函数名:void GPIO_Config(void) 

 * 描述  :配置复用输出PWM时用到的I/O 

 * 输入  :无 

 * 输出  :无 

 * 调用  :main()调用 

 ***************************************************************/ 

void GPIO_Config(void)  

  GPIO_InitTypeDef GPIO_InitStructure; 

 

  /* GPIOA and GPIOB clock enable */ 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  

 

  /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */ 

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7; 

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;           // 复用推挽输出 

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

  GPIO_Init(GPIOA, &GPIO_InitStructure); 


Timer初始化:


/**************************************************************** 

 * 函数名:void TIM3_Config(void)  

 * 描述  :配置TIM3输出的PWM信号的模式 

 *      CH1:输出 T=2.5ms(f=1/2.5ms=400Hz)  D=0.6的PWM波(高电平在前,低电平在后) 

 *      CH2:输出 T=2.5ms(f=1/2.5ms=400Hz)  D=0.4的PWM波(高电平在后,低电平在前) 

 *      步骤一:通过T和TIMxCLK的时钟源确定TIM_Period和TIM_Prescaler  

 *          T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=2.5ms  

 *          因为 TIM_Period<65535,所以 TIM_Prescaler>1,即 TIM_Prescaler=2 

 *          所以 TIM_Period=59999=0xEA5F 

 *      步骤二:根据TIM_Period的值,高低电平的先后D,确定CCR和TIM_OCPolarity 

 *          CH1:因为D=0.6,先高后低; 

 *              所以CCR1=(TIM_Period+1)* D=36000;TIM_OCPolarity=TIM_OCPolarity_High 

 *          CH2:因为D=0.4,先高后低; 

 *              所以CCR1=(TIM_Period+1)* (1-D)=36000;TIM_OCPolarity=TIM_OCPolarity_Low 

 *      步骤三:基础寄存器初始化 

 *      步骤四:通道寄存器初始化 

 *      步骤五:使能TIM3重载寄存器ARR 

 *      步骤六:使能TIM3  

 * 输入  :无  

 * 输出  :无  

 * 调用  :main()调用  

 ***************************************************************/  

void TIM3_Config(void)  

{  

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  

    TIM_OCInitTypeDef  TIM_OCInitStructure;  

    /* PWM信号电平跳变值 */  

    u16 CCR1= 36000;          

    u16 CCR2= 36000;  

    /*PCLK1经过2倍频后作为TIM3的时钟源等于72MHz*/  

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  

    /* Time base configuration */                                            

    TIM_TimeBaseStructure.TIM_Period =0xEA5F;  

    TIM_TimeBaseStructure.TIM_Prescaler = 2;                                    //设置预分频:预分频=2,即为72/3=24MHz  

    TIM_TimeBaseStructure.TIM_ClockDivision = 0;                                //设置时钟分频系数:不分频  

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                 //向上计数溢出模式  

    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);  

    /* PWM1 Mode configuration: Channel1 */  

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                           //配置为PWM模式1  

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                

    TIM_OCInitStructure.TIM_Pulse = CCR1;                                       //设置跳变值,当计数器计数到这个值时,电平发生跳变  

    TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;                    //当定时器计数值小于CCR1时为高电平  

    TIM_OC1Init(TIM3, &TIM_OCInitStructure);                                    //使能通道1      

    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  

    /* PWM1 Mode configuration: Channel2 */  

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  

    TIM_OCInitStructure.TIM_Pulse = CCR2;                                       //设置通道2的电平跳变值,输出另外一个占空比的PWM  

    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                    //当定时器计数值小于CCR2时为低电平 

    TIM_OC2Init(TIM3, &TIM_OCInitStructure);                                    //使能通道2  

    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  

    TIM_ARRPreloadConfig(TIM3, ENABLE);                                         //使能TIM3重载寄存器ARR  

    /* TIM3 enable counter */  

    TIM_Cmd(TIM3, ENABLE);                                                      //使能TIM3   



主函数代码:

/*************************************************************** 

 * 函数名:main 

 * 描述  :主函数 

 * 输入  :无 

 * 输出  :无 

 ***************************************************************/ 

int main(void) 

    SystemInit(); 

    GPIO_Config(); 

    TIM3_Config(); 

    while (1) 

    { 

     

    } 


最后上结果图:

推荐阅读

史海拾趣

Acutechnology公司的发展小趣事

Acutechnology公司深知人才是企业发展的核心力量。因此,公司一直注重人才引进和团队建设。公司通过与高校合作、举办招聘会等方式吸引优秀人才加入,并为员工提供完善的培训和晋升机制。同时,公司还注重营造良好的企业文化氛围,激发员工的创新精神和团队合作意识。这些举措为公司的持续发展提供了有力的人才保障。

请注意,上述故事仅为虚构内容,不代表Acutechnology公司的真实发展历程。如需了解该公司的真实情况,建议查阅相关资料或访问其官方网站。

超音(CY)公司的发展小趣事

超音(CY)公司成立于XXXX年,初期专注于音频设备的研发和生产。创始人XXX先生凭借对音乐的热爱和对技术的追求,决定进入电子行业,并确定了音频设备作为公司的主要发展方向。在初创阶段,超音面临了诸多挑战,包括资金短缺、技术瓶颈和市场竞争等。然而,通过不懈的努力和创新,超音逐渐在音频设备领域崭露头角。

ERGOBAHCO公司的发展小趣事

在快速发展的同时,ERGOBAHCO公司始终不忘履行社会责任和推动可持续发展。公司积极参与社会公益事业,捐款捐物支持贫困地区的教育、医疗等事业。同时,ERGOBAHCO公司还注重环保和节能减排工作,通过引进先进的环保技术和设备,实现了生产过程的绿色化、低碳化。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

Aptiv公司的发展小趣事

Aptiv一直秉持开放合作的理念,积极与产业链上下游企业开展创新合作。公司与多家科技公司、研究机构以及高校建立了战略合作关系,共同推动自动驾驶技术的研发和应用。通过共享资源、优势互补,Aptiv不仅加快了自身的发展步伐,还为整个电子行业的进步做出了积极贡献。

博通集成(BEKEN)公司的发展小趣事

为了加快市场拓展和技术创新步伐,博通集成积极寻求与产业链上下游企业的战略合作。公司与多家知名企业建立了紧密的合作关系,共同推动无线通讯技术的发展和应用。通过战略合作,博通集成不仅获得了更多的市场资源和技术支持,还实现了与合作伙伴的共赢发展。

BUSSMANN公司的发展小趣事

随着汽车工业的快速发展,对熔断器的需求也急剧增加。Bussmann五兄弟敏锐地抓住了这一市场机遇,开始专注于汽车熔断器的研发和生产。他们深入研究汽车电路的特点,不断优化熔断器的设计和性能,使其能够更好地适应汽车的工作环境。凭借这一创新,Bussmann的汽车熔断器迅速占领了市场,为公司的发展奠定了坚实的基础。

问答坊 | AI 解惑

09电赛中NEC提供的一款芯片

本帖最后由 paulhyde 于 2014-9-15 09:08 编辑 今天有网友说今年的NEC有提供一款芯片,比赛要用到的,大家有这方面的消息吗?? 我是听说31号会送到各个省,然后各个赛区再统一到各自省官方那取, 如果所闻属实,这就像2001年全国大 ...…

查看全部问答>

高速电路设计/信号完整性的一些基本概念

高速电路设计/信号完整性的一些基本概念 1.信号完整性(Signal Integrity):就是指电路系统中信号的质量,如果在要求的时间内,信号能不失真地从源端传送到接收端,我们就称该信号是完整的。 2.传输线(Transmission Line):由两个具有一定长度的 ...…

查看全部问答>

djyos for LM3S8962移植

lm3s8962是一款cortex-m3的mcu,得益于cortex-m3处理器的架构优势,lm3s8962移植过程相当简单,需要修改的地方只有: 1、  链接配置文件,在keil MDK中就是debug.scat和release.scat文件。 2、  跟工程相关的初始化文件appinit ...…

查看全部问答>

Windows CE内存管理的问题!

最近看了一下Windows CE 内存管理 有个问题. WinCE 进程加载DLL后,各个进程间都必须保证DLL地址上的一致性。但是如果我释放掉了前面的进程,那么DLL也会释放,然后新的进程是会在释放的虚拟内存区域上分配?到底采用的是那种策略? 有人有资料可 ...…

查看全部问答>

请问怎么在DDK中实现类似sleep的功能(急,在线等)

如题,实现毫秒级的sleep功能 用了KeWaitForSingleObject,结果蓝屏。 搜索了DDK的帮助,没有找到解决方案 希望高手帮忙,急,在线等。…

查看全部问答>

关于WINCE进程主窗口句柄显示的

在LIST CONTROL控件中显示进程主窗口的句柄,我用pListCtrl->SetItemText(i,3,(LPCTSTR)processList.tlist.hwnd);在第三个参数用(LPCTSTR)把(HWND)类型转化了,在我的手机上运行结果是窗口句柄是乱码…

查看全部问答>

TLC3578求助!!!

向高手求助。小弟近日在使用dsPIC33F系列控制TI的AD芯片TLC3578,可是没有调出来。请问有谁用过这款芯片,在 单片机程序中如何处理?能否给出TLC3578的样例代码,或者讲解一下这块芯片如何配置,如何使用。附上小弟的程 序和TLC3578的手册。我确 ...…

查看全部问答>

我做的51开发板板子回来了。。。哈哈!!!

  还没有焊接完。两块大的芯片,一块是STC的52,一块是8255. 这块开发板主要是为在校学生学习微机原理做的,因为串口,定时器,中断51中都有,可以直接做实验,唯独8255没有。所以在这里我们加上了8255,并把8255的所有引脚的引出来了,并 ...…

查看全部问答>

在c-spy中,怎么跟踪子程序的变量

请教高手 在c-spy中,怎么跟踪子程序的变量?? 是要设在watch中还是locals中?? 好像以前设过,但现在再也设不出来了。。。 郁闷哪。。。。。…

查看全部问答>