
挺郁闷的两块板子现在都不能连接了,等待工具来隔断PIN脚把BOOT0拉高吧。 用被人的的板子继续实验。试试PWM波做呼吸灯。 第一步选择引出来的PA9,接一个LED的+,在找一个GND把LED的- 导通。 工程只需要选选PA9模式(会有warnning)在选择TIMI-CH2就解除了 ![]() 第二部:设置一下定时器吧 7200---1000 ![]() ![]() 第三部直接生产代码吧。 USER_PWM_SetDutyRatio(&htim1,TIM_CHANNEL_2,n); 这个就是HAL设置占空比的API 自己改一改: void USER_PWM_SetDutyRatio(TIM_HandleTypeDef *htim,uint32_t Channel,uint8_t value) { TIM_OC_InitTypeDef sConfigOC; uint32_t period=htim->Init.Period+1; uint32_t pluse=((value * period)/100); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = pluse; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(htim, &sConfigOC, Channel); HAL_TIM_PWM_Start(htim, Channel); } 该函数就是:把**定时器的**通道的比较值设置成**,而且他不是直接设置成**而是设置成**% 所以第三个传参是0--100 #include "math.h" while (1) { HAL_Delay(50); USER_PWM_SetDutyRatio(&htim1,TIM_CHANNEL_2,n); n=100*sin(i*3.1415926/180); ////////////MUST * / i+=2; if(i>=180) i=0; } 现在就可以呼吸了。效果的好坏主要在算法,现在用的sin函数,差强人意吧。 |
代码还是那个函数USER_PWM_SetDutyRatio(&htim4,TIM_CHANNEL_3,n);
好主意 有空研究研究
噢 两次实验不一样 效果不好的是7200---1000 效果好的是72000---100
不对 不对 u16 没有72000的 MX在65535就写不进去了
void MX_TIM4_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig;
TIM_OC_InitTypeDef sConfigOC;
htim4.Instance = TIM4;
htim4.Init.Prescaler = 7200-1;
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
htim4.Init.Period = 100-1;
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
{
Error_Handler();
}
HAL_TIM_MspPostInit(&htim4);
}