这个项目将会不断改变pwm占空比,使用proteus示波器进行观察。
1. proteus8.15 原理图
2. cubemx
上图是配置外部晶振
上图配置在proteus中没啥作用,注意: 在实际开发板中,一定要配置它,不然下一次你写不进代码。
上图配置时钟源,圈出的红框位置直接输入72,然后回车即可。
上图配置pwm分频系数、计数器等值。
这一部分我要说说自己的理解,可能是错的,不过无所谓啦
兄弟们请看,本例中分频系数为71(72-1),72MHz(72000,000Hz)进行72分频后,时钟频率是1000,000Hz。1000,000Hz时,时钟周期是0.000001S,也就是说现在时钟周期是1微秒。
兄弟们再看,计数器的值是1000,所以pwm会在1000次时钟周期循环一次,也就是说1毫秒循环一次。
兄弟们再看,占空比设置时,如果设置为500,也就是500/100=50%,此时0.5毫秒的高电平,0.5毫秒的低电平。
3. keil 源码
int main(void)
{
/* USER CODE BEGIN 1 */
/* 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_TIM1_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_1, 500);
uint16_t pwm=0;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
while (pwm< 1000)
{
pwm++;
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_1, pwm);
}
pwm = 0;
HAL_Delay(1);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
4. 源码
gitee