电子设计省赛--SPWM(死区时间)
2024-10-11 16:26:04
//2014年4月17日
//2014年6月20日入“未完毕”
//2014年6月21日
有两种方案:双定时器和单定时器
学长表示双定时器输出波形不好,还是单定时器好。
原理例如以下:
SPWM採用正弦波与三角波比較方式,详细百度。
单片机详细工作:
TIM1
三角波:DIR选中央对齐模式
正弦波:数组实现採样的正弦波
ARR:设为carrval,决定了输出波形的频率
CCR1:我们通过改变它来实现占空比的改变
改变CCR1:每次计数器完毕ARR,更新时产生中断(我们用UP_IQR),此时把正弦波数组赋给CCR1
注意:正弦波数组要经过放大,使其与ARR匹配
void SPWM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/*******************************************************************************/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO | RCC_APB2Periph_TIM1,ENABLE);
/*********************** GPIO ********************************************************/ //PA.8口设置为TIM1的OC1输出口
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //PB.13口设置为TIM1_CH1N和TIM1_CH2N输出口
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); /************************PWM频率=72000/(360*200)=1Khz*******************************************************/ //TIM1基本计数器设置(设置PWM频率)
//频率=TIM1_CLK/(ARR+1)
TIM_BaseInitStructure.TIM_Period = 199;
TIM_BaseInitStructure.TIM_Prescaler = 359;
TIM_BaseInitStructure.TIM_ClockDivision = 0;
TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);
TIM_ARRPreloadConfig(TIM1, ENABLE); //TIM1->CR1=0x00b1;
TIM1->CR2=0x0200;
/*************************设置占空比******************************************************/ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; //互补输出极性
TIM_OCInitStructure.TIM_Pulse = 150; //TIM1_Pulse设置了待装入捕获比較寄存器的脉冲值 /*************************** 多路SPWM ******************************/
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
//启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置)
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM1->CCR1=0x0100;
TIM1->ARR=CarrVal;
/***************************死区设置****************************************************/
TIM1->CR1&=0x00ff; //配置时钟分频因子 Tdts = Tck_int = 72M
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
TIM_BDTRInitStructure.TIM_DeadTime = 0x90; //这里调整死区大小0-0xff
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
/*******************************************************************************/
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE); //TIM1->DIER=0x0001;
//TIM1开启
TIM_Cmd(TIM1, ENABLE);
//TIM1_OC通道输出PWM(一定要加)
TIM_CtrlPWMOutputs(TIM1, ENABLE); }
最新文章
- 返回人民币大写方式(num2rmb)
- 仿iphone日历插件(beta)
- 轻松掌握:JavaScript状态模式
- Visual Studio 开发平台的安装与单元测试
- Python 中文编码问题小结
- sed 常见用法
- node.js在windows下的学习笔记(1)---安装node.js
- [Angular 2] Mapping Streams to Values to Affect State
- openssh-clients(CentOS 7 自带的SSH客户端)
- CCFlow最近在山东济南总部举行组团培训活动,有參加的能够报名
- Web标准的简单理解 不同内核浏览器的差异以及浏览器渲染简介(转)
- PythonStudy——闭包
- chrome浏览器被reimage pair 劫持怎么处理
- python使用 openpyxl包 excel读取与写入
- MVC知识点记录
- linux 关闭笔记本自带键盘
- Java第14章笔记
- C#编程(七十二)----------DynamicObject和ExpandoObject
- am335x ar8031 双网口配置记录
- fzyzojP3782 -组合数问题