关键配置
对应GPIO
NVIC中断管理
定时器初始化
定时器输出模式TIM_OC初始化(模式为TIM_OCMode_Toggle)
频率与占空比的计算
计数频率的计算
若使用比较输出,则ARR表示计数的上限,基本无用。计数频率由TIM_Prescaler成员变量配置。若配置TIM_Prescaler=71,输入时钟为72 M H z 72MHz72MHz,则计数频率为:
计数规则
当计数器数到CCR所储存的值时,输出电平就会翻转。
频率和占空比的配置
由计数规律我们可以通过修改CCR值的方法来得到我们想要的频率和占空比。
比如:计数频率为 1 M 1M1M,想要得到10 K 10K10K,占空比为80 % 80%80%的PWM波。
令空闲输出电平为0,关闭影子寄存器以便立即赋值。
当程序开始,立即进入中断,为CCR赋值为20,此时电平为低电平;
当计数器数过20,翻转电平,变为高电平,再次进入中断,为CCR赋值为20+80;
当计数器再数80,翻转电平,变为低电平,再次进入中断,为CCR赋值为20+80+20;
…
于是可见,数100为一个周期,其中20为低电平,80为高电平。输出PWM波频率1 M 1000 = 10 K H z frac{1M}{1000}=10KHz
1000
1M
=10KHz,占空比80 % 80%80%.
示例代码
从PA6和PA7输出两路PWM;PA6频率为10KHz,占空比为80% ;PA7频率为1KHz,占空比为20%
PWM驱动配置:
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
// PA1 PA2
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);
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable the TIM3 global Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void PWM_Config()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_Configuration();
NVIC_Configuration();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 65535; // 在TIM_OCMode_Toggle模式下ARR几乎无用
TIM_TimeBaseStructure.TIM_Prescaler = 71; // 72分频,计数频率为72M/72=1M
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数方式为向上计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
/* Output Compare Toggle Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; // 空闲状态为低电平
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable); // 关闭影子寄存器,当给CCR赋值时,即刻赋值
/* Output Compare Toggle Mode configuration: Channel2 */
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);
TIM_Cmd(TIM3, ENABLE);
TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2, ENABLE);
}
中断代码如下:
extern __IO uint16_t CCR1_Val;
extern __IO uint16_t CCR2_Val;
uint16_t capture = 0;
u8 pa6_state=0,pa7_state=0;
float zhankong1=0.2;
float zhankong2=0.2;
void TIM3_IRQHandler(void)
{
/* TIM3_CH1 toggling with frequency = 10K Hz */
if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC1 );
capture = TIM_GetCapture1(TIM3);
if(pa6_state ==0)
{
TIM_SetCompare1(TIM3, capture + CCR1_Val*zhankong1 );
pa6_state = 1;
}
else
{
TIM_SetCompare1(TIM3, capture + CCR1_Val*(1-zhankong1) );
pa6_state = 0;
}
}
/* TIM3_CH2 toggling with frequency = 1k Hz */
if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
capture = TIM_GetCapture2(TIM3);
if(pa7_state ==0)
{
TIM_SetCompare2(TIM3, capture + CCR2_Val*zhankong2 );
pa6_state = 1;
}
else
{
TIM_SetCompare2(TIM3, capture + CCR2_Val*(1-zhankong2) );
pa6_state = 0;
}
}
}
上一篇:STM32 EXTI外部中断小结
下一篇:STM32固件库的小结
推荐阅读最新更新时间:2024-11-10 10:12
推荐帖子
- WinCE模拟器上网问题?
- 在vs2005下定制OSDesign。怎样设置才可以在模拟器上使用IE网?WinCE模拟器上网问题?up
- kento WindowsCE
- 关于CCSV5与MSP430F5529开发板连接问题
- 我是刚刚接触这一开发环境与软件的,在学习例程的过程中。我发现无法将程序下载开发板而且是编译的环节就出现了问题。编译显示出错:DebugAssertionFailed!File:isctype.cLine:67Expression(unsigned)(c+1)=256我选择VS2010进行调试修改,但是错误的文件不是我所编译的程序,而是ccsv5的安装根目录下的cl430.exe不可改动,只能显示反编译。这一问题是否跟我的电脑是win764位相关呢?还是其他的
- zi_mian 微控制器 MCU
- 一个无线充电器拆解
- 无线充电技术主要利用电磁技术,在发射器将电流转化为电磁,手机通过内置芯片接收器将电磁转化为电流为手机充电。现在不仅越来越多的品牌手机支持无线充电技术,也会有越来越多的公共场所提供无线充电底座。2018年必定是无线充电器大火的一年。今拆解则是绿联另一款新品无线充电器CD176白色包装盒,采用天地盖打开方式。正面印着无线充电器底座的外观图片。附赠一条黑色充电线缆,另有产品保修卡、说明书。附赠一条黑色充电线缆,另有产品保修卡、说明书。CD176无线充正面采用一块阻燃PC材质面板,面
- qwqwqw2088 模拟与混合信号
- ARM,FPGA学习群QQ:37392778,有高级工程师指导做项目,想学习者加入
- 想学习ARM,FPGA,相关开发的,有工程师指导,现有开发项目,可长期指导ARM,FPGA学习群QQ:37392778,有高级工程师指导做项目,想学习者加入支持搂主,收藏我也想知道,正在找這方面的資料~~~~~支持,顶一下!友情Up!大家好,感谢长期以来朋友们的支持,本群已满已久,为了方便大家,新申请群48462765,欢迎加入新申请群48462765
- treetree600 ARM技术
- Sysgen 错误
- BUILD:d:\\WINCE500\\PBWorkspaces\\JZ4740\\WINCE500\\VENUS_MIPSII\\cesysgen\\ddk\\inc\\ntddndis.h(863):errorC2220:warningtreatedaserror-noobjectfilegeneratedBUILD:d:\\WINCE500\\PBWorkspaces\\JZ4740\\WINCE500\\VENUS_MIPSII\\cesysgen\
- daisyquan 嵌入式系统
- 《CMake 构建实战-项目开发卷》分享1—编译构建基础
- 《CMake构建实战-项目开发卷》分享1编译构建基础导言本书第一章《构建之旅》,从命令行编译源程序,从程序由单一文件构成,到多个文件构成,再到程序连接到静态库文件,程序链接到动态库文件,非常详细的描述了目标构建的关系、构建书序。最后引入Boost库,构建一个依赖于第三方库的程序。回首我的嵌入式开发历史,吃了多少编译的亏,吭哧吭哧解决了多少编译相关的错误,但是没有形成一个系统的知识架构,非常遗憾。感谢本书作者为我补全了编译相关的一些知识。浅谈Makefile
- CoderX9527 编程基础
设计资源 培训 开发板 精华推荐
- 使用 ON Semiconductor 的 NCP1580 的参考设计
- 使用 Diodes Incorporated 的 ZSAT600 的参考设计
- FRDM-HB2000-EVM: FRDM-HB2000-EVM: Freedom Platform for MC33HB2000, HSOP32, 10 A H-Bridge, RDSon 235mOhm max, Programmable Brushed DC Motor Driver
- MC33269 800mA 可调输出、低压降稳压器、电流调节器的典型应用
- STW81101-EVB4G,STW81103 评估板,工业应用的 4GHz 单输出 PLL 时钟发生器
- ADP165UJ-EVALZ,ADP165 LFCSP LDO 线性稳压器评估板
- 具有 24 位 RTD 前端的完整 IO-Link 传感器-发送器参考设计
- AM6TW-2412SZ 12V 6 瓦单路输出 DC-DC 转换器的典型应用
- AD8032AR-EB,双通道高速运算放大器评估板,采用 8 引脚 SOIC 封装
- pwm-voltage