STM32标准库函数之 TIM1定时器产生PWM波

/*
函数功能:定时器1通道1 4产生PWM波
函数参数:无
函数返回值:无
函数描述:无
*/
void Dingshiqi1_PWM_Init(void)
{
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;  //时间基 结构体变量
	GPIO_InitTypeDef GPIO_InitStruct;								//GPIO初始化 结构体变量
	TIM_OCInitTypeDef TIM_OCInitStruct;							//通道初始化 结构体变量
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); //使能TIM1定时器时钟线
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	//使能GPIOA时钟线
	
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;  //这里跟TIM1 产生PWM波功能无关
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计时模式
	TIM_TimeBaseInitStruct.TIM_Period = 1000;    //计算到1000 那就是定时10ms
	TIM_TimeBaseInitStruct.TIM_Prescaler = 720;  //最高频率72MHZ  这里定义 预分频720 
																							 
	TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);//初始化函数 让刚刚配置的参数 输入到对应寄存器里面
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //GPIO采用复用推挽输出模式
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_11; //TIM1同时产生两路PWM波 在管脚a8 a11
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;  //GPIO速度50MHZ
	
	GPIO_Init(GPIOA,&GPIO_InitStruct);  //初始化函数 让刚刚配置的参数 输入到对应寄存器里面
	
	TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //PWM1模式
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性高
	TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//让捕获/比较寄存器使能
	TIM_OCInitStruct.TIM_Pulse = 0;  //初始化占空比0   占空比可以依照TIM_Period进行配置 在它范围内就好了
	
	TIM_OC1Init(TIM1,&TIM_OCInitStruct); //初始化函数 让刚刚配置的参数 输入到对应寄存器里面
	TIM_OC4Init(TIM1,&TIM_OCInitStruct); //初始化函数 让刚刚配置的参数 输入到对应寄存器里面
	TIM_Cmd(TIM1,ENABLE);    //使能定时器TIM1
	TIM_CtrlPWMOutputs(TIM1,ENABLE);  //确定让TIM1输入PWM
	TIM_OC1PreloadConfig(TIM1,ENABLE);  //让捕获/比较1寄存器 预装载功能使能 同时配置CC1通道为输出
	TIM_OC4PreloadConfig(TIM1,ENABLE); //让捕获/比较1寄存器 预装载功能使能 同时配置CC4通道为输出
	TIM_ARRPreloadConfig(TIM1,ENABLE);  //自动重装载预装载允许
}
 

该代码生成的波形图:

        占空比为:300,TIM_OCInitStruct.TIM_Pulse = 300;

       黄色的线是通道1 ,  紫色是通道4.

        

高级控制定时器框图 :

        

上面详细说明:

        代码说明:

               1. TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;  //这里跟TIM1 产生PWM波功能无关。

                原因:CKD[1:0]:时钟分频因子 (Clock division) 
这2位定义在定时器时钟(CK_INT)频率、死区时间和由死区发生器与数字滤波器(ETR,TIx)所用
的采样时钟之间的分频比例。 -----所以无关。

                2.TIM_TimeBaseInitStruct.TIM_Period = 1000;    //计算到1000  那就是定时10ms
    TIM_TimeBaseInitStruct.TIM_Prescaler = 720;  //最高频率72MHZ  这里定义 预分频720 

       原因:经stm32f1xx参考手册知计数器的时钟频率(CK_CNT)等于fCK_PSC/( PSC[15:0]+1)。所以这边719 就是720分频。定时10ms计算如下:10ms=(1/(72/720)*1000)s*(10^(-6))。

       3.    TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//让捕获/比较寄存器使能

                经过示波器的判断,发现这个参数无论使不使能,都不影响OC1通道的输出,但是会影响其它通道输出。( 找到原因的朋友 评论一下 ,谢谢啦)

TIM_OutputState_Enable时候:示波器如上图。

TIM_OutputState_Disable时:

        

               3.细心的朋友还发现TIM_OCInitStruct结构体下面还有这几个参数(作用如下):

                           1. TIM_OCInitStruct.TIM_OCNIdleState
                           2.TIM_OCInitStruct.TIM_OCNPolarity
                           3. TIM_OCInitStruct.TIM_OutputNState

 TIM_OCInitStruct.TIM_OCNIdleState 这个参数与PWM输出无关,经参考手册查询得  该参数用于  刹车和死区寄存器。

TIM_OCInitStruct.TIM_OCNPolarity 这个参数可以改变通道1 的输出极性,目前不怎么了解(为什么 输出极性 那里有了 还有弄个互补输出极性)。

 TIM_OCInitStruct.TIM_OutputNState 参数决定TIMX_CH1N通道是否输出。如上图那个地方。

另外的说明这三个参数,只与高级定时器相关,若没有使用高级定时器就可以不写,让它默认配置。

### 关于ArcGIS License Server无法启动的解决方案 当遇到ArcGIS License Server无法启动的情况,可以从以下几个方面排查并解决问题: #### 1. **检查网络配置** 确保License Server所在的计算机能够被其他客户端正常访问。如果是在局域网环境中部署了ArcGIS Server Local,则需要确认该环境下的网络设置是否允许远程连接AO组件[^1]。 #### 2. **验证服务状态** 检查ArcGIS Server Object Manager (SOM) 的运行情况。通常情况下,在Host SOM机器上需将此服务更改为由本地系统账户登录,并重启相关服务来恢复其正常工作流程[^2]。 #### 3. **审查日志文件** 查看ArcGIS License Manager的日志记录,寻找任何可能指示错误原因的信息。这些日志可以帮助识别具体是什么阻止了许可服务器的成功初始化。 #### 4. **权限问题** 确认用于启动ArcGIS License Server的服务账号具有足够的权限执行所需操作。这包括但不限于读取/写入特定目录的权利以及与其他必要进程通信的能力。 #### 5. **软件版本兼容性** 保证所使用的ArcGIS产品及其依赖项之间存在良好的版本匹配度。不一致可能会导致意外行为完全失败激活license server的功能。 #### 示例代码片段:修改服务登录身份 以下是更改Windows服务登录凭据的一个简单PowerShell脚本例子: ```powershell $serviceName = "ArcGISServerObjectManager" $newUsername = ".\LocalSystemUser" # 替换为实际用户名 $newPassword = ConvertTo-SecureString "" -AsPlainText -Force Set-Service -Name $serviceName -StartupType Automatic New-ServiceCredential -ServiceName $serviceName -Account $newUsername -Password $newPassword Restart-Service -Name $serviceName ``` 上述脚本仅作为示范用途,请依据实际情况调整参数值后再实施。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值