历史上的今天
今天是: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)
{
}
}
最后上结果图:
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 09:08 编辑 今天有网友说今年的NEC有提供一款芯片,比赛要用到的,大家有这方面的消息吗?? 我是听说31号会送到各个省,然后各个赛区再统一到各自省官方那取, 如果所闻属实,这就像2001年全国大 ...… 查看全部问答> |
|
高速电路设计/信号完整性的一些基本概念 1.信号完整性(Signal Integrity):就是指电路系统中信号的质量,如果在要求的时间内,信号能不失真地从源端传送到接收端,我们就称该信号是完整的。 2.传输线(Transmission Line):由两个具有一定长度的 ...… 查看全部问答> |
|
lm3s8962是一款cortex-m3的mcu,得益于cortex-m3处理器的架构优势,lm3s8962移植过程相当简单,需要修改的地方只有: 1、 链接配置文件,在keil MDK中就是debug.scat和release.scat文件。 2、 跟工程相关的初始化文件appinit ...… 查看全部问答> |
|
最近看了一下Windows CE 内存管理 有个问题. WinCE 进程加载DLL后,各个进程间都必须保证DLL地址上的一致性。但是如果我释放掉了前面的进程,那么DLL也会释放,然后新的进程是会在释放的虚拟内存区域上分配?到底采用的是那种策略? 有人有资料可 ...… 查看全部问答> |
|
如题,实现毫秒级的sleep功能 用了KeWaitForSingleObject,结果蓝屏。 搜索了DDK的帮助,没有找到解决方案 希望高手帮忙,急,在线等。… 查看全部问答> |
|
在LIST CONTROL控件中显示进程主窗口的句柄,我用pListCtrl->SetItemText(i,3,(LPCTSTR)processList.tlist.hwnd);在第三个参数用(LPCTSTR)把(HWND)类型转化了,在我的手机上运行结果是窗口句柄是乱码… 查看全部问答> |
|
向高手求助。小弟近日在使用dsPIC33F系列控制TI的AD芯片TLC3578,可是没有调出来。请问有谁用过这款芯片,在 单片机程序中如何处理?能否给出TLC3578的样例代码,或者讲解一下这块芯片如何配置,如何使用。附上小弟的程 序和TLC3578的手册。我确 ...… 查看全部问答> |
|
还没有焊接完。两块大的芯片,一块是STC的52,一块是8255. 这块开发板主要是为在校学生学习微机原理做的,因为串口,定时器,中断51中都有,可以直接做实验,唯独8255没有。所以在这里我们加上了8255,并把8255的所有引脚的引出来了,并 ...… 查看全部问答> |
|
请教高手 在c-spy中,怎么跟踪子程序的变量?? 是要设在watch中还是locals中?? 好像以前设过,但现在再也设不出来了。。。 郁闷哪。。。。。… 查看全部问答> |




