历史上的今天
今天是:2024年10月09日(星期三)
2019年10月09日 | stm32 time4 pwm
2019-10-09 来源:eefocus
pwm.h
#ifndef _PWM_H
#define _PWM_H
#include "sys.h"
void TIM14_PWM_Init(u32 arr,u32 psc);
#endif
pwm.c
#include "pwm.h"
//TIM4 PWM部份初始化
//PWM 输出初始化arr:自动重装值 psc:时钟预分频系数
void TIM14_PWM_Init(u32 arr,u32 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);//time14时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//TIME14在PF9上,使能gpioF
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);//GPF9复用为tim14
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; //GPIOF9
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //复用
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz; //高速
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; //推挽复用
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化GPIOF9
TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //
TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure); //初始化定时器14
//初始化tim14 channel1 PWM模式
//PWM 调制模式1只要 TIMx_CNT < TIMx_CCR1,通道 1 便为有效状态,否则为无效状态。
//可以理解为 if TIMx_CNT < TIMx_CCR1 输出否则不输出 计数cnt
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//输出极性低,因为PF9连接的LED0低电平才会亮
TIM_OC1Init(TIM14,&TIM_OCInitStructure); //初始化外设TIM1_40C1
TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable);//使能预装载寄存器
TIM_ARRPreloadConfig(TIM14,ENABLE);//CT1寄存器的位7 ARPE=1,这样ARR寄存器的内容在更新事件UEV发生时
//传送到影子寄存器
TIM_Cmd(TIM14,ENABLE);//使能tim14
}
main.c
#include "sys.h"
#include "delay.h"
#include "pwm.h"
int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//系统优先级分组2
delay_init(168);//168 MHz
TIM14_PWM_Init(500-1,84-1);//
//定时器的频率为84Mhz,分频系数为84,84000000/84=1Mhz 0.000001秒 1us;
//自动重装载值为500,定时器的周期=0.000001*500=0.0005s=500us=0.5ms,所以频率为1000ms/0.5ms=2khz
//定时器的频率为2Khz已经固定了
//
while(1)
{
delay_ms(10);
if(dir)
led0pwmval++;
else
led0pwmval--;
if(led0pwmval>300)dir=0; //3秒 到达300后,方向为递减
if(led0pwmval == 0)dir=1; //到达0后,方向为递增
TIM_SetCompare1(TIM14,led0pwmval); //修改比较值,修改占空比 此处修改CCR1为捕获/比较寄存器的值
}
}
/*
TIM_SetCompare1(TIM14,led0pwmval)每10ms设置了CCR1寄存器的值,
计算寄存器CNT的值为0~500这个不变(上面初始化时设了) 比较寄存器CCR1的值在变
通过前面设置只要CNT
又led0pwmval从0-300然后双从300到0,所以灯的亮度也是从低到高然后再从高到低
*/
史海拾趣
|
想求求各位大虾帮帮忙 看看用单片机控制步进电机正反转 调速 怎么弄 步进电机驱动是 用tb6560做的 我买了 步进驱动器--tb6560ahq-v2.0(0.5-3A ,2、8、1 ...… 查看全部问答> |
|
FLASH换成spansion S29GL了,可jtag无法写进去。好像不支持这片子。。用flash烧写器太麻烦。。 我应该怎么办?哪位高人有这片子的jtag烧写软件? 谢谢!· … 查看全部问答> |
|
需要写一个IE浏览器 请问怎么能检测到当前网络状态(应该是IE的状态)是否连上或者断开, 通过检测无线网卡的方式经过实验发现不行,因为无线网卡的驱动好象也不是时时检测这个连接状态的,我把AP断开,无线网卡的信号还很强, 现在想通过判断IE ...… 查看全部问答> |
|
USB 12Mbps的频率误差允许0.25%。而stm32f的HSI允许以40kHz左右的步长调节(改变HSITRIM的值)。40kHz/8MHz=0.5%,可惜呀。如果能以10kHz的步长调节HSI频率,同时保证HSI频率一定的稳定度,就可以用32768单晶振实现USB了!!!希望ST改进 ...… 查看全部问答> |
|
STM32开源开发环境的搭建EclipseSourceryG++ 中间有一段时间没来的及做,现在的进展是我用了3.4的固件库编译之类的都能通过,下载还没弄好,但是郁闷的是同样的程序烧进去却无法运行,哪位做过的给点提示,也欢迎大家讨论。 这两天在尝试着搭建Eclipse+ GNU ARM Eclipse Plug-in+ Sour ...… 查看全部问答> |




