仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
如图,定时器1的四个通道输出PWM脉冲驱动四个舵机到不同角度,一号舵机由于输入的PWM的宽度在主函数中循环调整,可以来回转动。主函数如下:
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t i = 0;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM2_Init();
MX_TIM1_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
while (1)
{
HAL_Delay(10);
if(i < 200)
{
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 50+i);
i++;
}
else
break;
}
while (1)
{
HAL_Delay(10);
if(i > 0)
{
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 50+i);
i--;
}
else
break;
}
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
在proteus中对舵机的属性进行了修改:重新设定最小PWM宽度为0.5ms与2.5ms。
需要说明的是先前想使用定时器2,但是不知什么原因,PA0(定时器2的默认通道1一直没输出),其余三个通道正常,CubeEMX的各通道配置方法也没看出问题。三个软件的设计与proteus仿真文件全部奉上
望大神明示:
仿真和代码.7z
(312.84 KB, 下载次数: 49)
|