PWM输出实验
直接上干货,懒得介绍了.......
杀了我算了,当时在y点上面乱改,现在补天又要乱改一桶(包能跑的)
main.c
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/KEY/key.h"
#include "./BSP/TIMER/atim.h"
int main(void)
{
uint8_t key = 0;
uint8_t t = 0;
GPIO_InitTypeDef gpio_init_struct;
HAL_Init(); /* ³õʼ»¯HAL¿â */
sys_stm32_clock_init(RCC_PLL_MUL9); /* ÉèÖÃʱÖÓ, 72Mhz */
delay_init(72); /* ÑÓʱ³õʼ»¯ */
usart_init(115200); /* ´®¿Ú³õʼ»¯Îª115200 */
led_init(); /* ³õʼ»¯LED */
key_init(); /* ³õʼ»¯°´¼ü */
/* ½« LED1 Òý½ÅÉèÖÃΪÊäÈëģʽ, ±ÜÃâºÍPC6³åÍ» */
gpio_init_struct.Pin = LED1_GPIO_PIN; /* LED1Òý½Å */
gpio_init_struct.Mode = GPIO_MODE_INPUT; /* ÉèÖÃΪÊäÈë */
gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_MEDIUM;
HAL_GPIO_Init(LED1_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯LED1Òý½Å */
atim_timx_npwm_chy_init(5000 - 1, 7200 - 1); /* 10KhzµÄ¼ÆÊýƵÂÊ,2hzµÄPWMƵÂÊ. */
ATIM_TIMX_NPWM_CHY_CCRX = 2500; /* ÉèÖÃPWMÕ¼¿Õ±È,50%,ÕâÑù¿ÉÒÔ¿ØÖÆÿһ¸öPWMÖÜÆÚ,LED1(BLUE)
* ÓÐÒ»°ëʱ¼äÊÇÁÁµÄ,Ò»°ëʱ¼äÊÇÃðµÄ,LED1ÁÁÃðÒ»´Î,±íʾһ¸öPWM²¨
*/
atim_timx_npwm_chy_set(5); /* Êä³ö5¸öPWM²¨(¿ØÖÆLED1(BLUE)ÉÁ˸5´Î) */
while (1)
{
key = key_scan(0);
if (key == KEY0_PRES) /* KEY0°´ÏÂ */
{
atim_timx_npwm_chy_set(5); /* Êä³ö5¸öPWM²¨(¿ØÖÆTIM8_CH1, ¼´PC6Êä³ö5¸öÂö³å) */
}
t++;
delay_ms(10);
if (t > 50) /* ¿ØÖÆLED0ÉÁ˸, Ìáʾ³ÌÐòÔËÐÐ״̬ */
{
t = 0;
LED0_TOGGLE();
}
}
what can i say
PWM输出代码
#include "./BSP/TIMER/atim.h"
#include "./BSP/LED/led.h"
TIM_HandleTypeDef g_timx_npwm_chy_handle; /* ¶¨Ê±Æ÷x¾ä±ú */
/* g_npwm_remain±íʾµ±Ç°»¹Ê£Ï¶àÉÙ¸öÂö³åÒª·¢ËÍ
* ÿ´Î×î¶à·¢ËÍ256¸öÂö³å
*/
static uint32_t g_npwm_remain = 0;
/**
* @brief ¸ß¼¶¶¨Ê±Æ÷TIMX ͨµÀY Êä³öÖ¸¶¨¸öÊýPWM ³õʼ»¯º¯Êý
* @note
* ¸ß¼¶¶¨Ê±Æ÷µÄʱÖÓÀ´×ÔAPB2, ¶øPCLK2 = 72Mhz, ÎÒÃÇÉèÖÃPPRE2²»·ÖƵ, Òò´Ë
* ¸ß¼¶¶¨Ê±Æ÷ʱÖÓ = 72Mhz
* ¶¨Ê±Æ÷Òç³öʱ¼ä¼ÆËã·½·¨: Tout = ((arr + 1) * (psc + 1)) / Ft us.
* Ft=¶¨Ê±Æ÷¹¤×÷ƵÂÊ,µ¥Î»:Mhz
*
* @param arr: ×Ô¶¯ÖØ×°Öµ
* @param psc: ʱÖÓÔ¤·ÖƵÊý
* @retval ÎÞ
*/
void atim_timx_npwm_chy_init(uint16_t arr, uint16_t psc)
{
GPIO_InitTypeDef gpio_init_struct;
TIM_OC_InitTypeDef timx_oc_npwm_chy; /* ¶¨Ê±Æ÷Êä³ö */
ATIM_TIMX_NPWM_CHY_GPIO_CLK_ENABLE(); /* TIMX ͨµÀIO¿ÚʱÖÓʹÄÜ */
ATIM_TIMX_NPWM_CHY_CLK_ENABLE(); /* TIMX ʱÖÓʹÄÜ */
g_timx_npwm_chy_handle.Instance = ATIM_TIMX_NPWM; /* ¶¨Ê±Æ÷x */
g_timx_npwm_chy_handle.Init.Prescaler = psc; /* ¶¨Ê±Æ÷·ÖƵ */
g_timx_npwm_chy_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* µÝÔö¼ÆÊýģʽ */
g_timx_npwm_chy_handle.Init.Period = arr; /* ×Ô¶¯ÖØ×°ÔØÖµ */
g_timx_npwm_chy_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; /*ʹÄÜTIMx_ARR½øÐлº³å */
g_timx_npwm_chy_handle.Init.RepetitionCounter = 0; /* Öظ´¼ÆÊýÆ÷³õʼֵ */
HAL_TIM_PWM_Init(&g_timx_npwm_chy_handle); /* ³õʼ»¯PWM */
gpio_init_struct.Pin = ATIM_TIMX_NPWM_CHY_GPIO_PIN; /* ͨµÀyµÄCPIO¿Ú */
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍêÊä³ö */
gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */
HAL_GPIO_Init(ATIM_TIMX_NPWM_CHY_GPIO_PORT, &gpio_init_struct);
timx_oc_npwm_chy.OCMode = TIM_OCMODE_PWM1; /* ģʽѡÔñPWM 1*/
timx_oc_npwm_chy.Pulse = arr / 2; /* ÉèÖñȽÏÖµ,´ËÖµÓÃÀ´È·¶¨Õ¼¿Õ±È */
/* ÕâÀïĬÈÏÉèÖñȽÏֵΪ×Ô¶¯ÖØ×°ÔØÖµµÄÒ»°ë,¼´Õ¼¿Õ±ÈΪ50% */
timx_oc_npwm_chy.OCPolarity = TIM_OCPOLARITY_HIGH; /* Êä³ö±È½Ï¼«ÐÔΪ¸ß */
HAL_TIM_PWM_ConfigChannel(&g_timx_npwm_chy_handle, &timx_oc_npwm_chy, ATIM_TIMX_NPWM_CHY); /* ÅäÖÃTIMxͨµÀy */
HAL_NVIC_SetPriority(ATIM_TIMX_NPWM_IRQn, 1, 3); /* ÉèÖÃÖжÏÓÅÏȼ¶£¬ÇÀÕ¼ÓÅÏȼ¶1£¬×ÓÓÅÏȼ¶3 */
HAL_NVIC_EnableIRQ(ATIM_TIMX_NPWM_IRQn); /* ¿ªÆôITMxÖÐ¶Ï */
__HAL_TIM_ENABLE_IT(&g_timx_npwm_chy_handle, TIM_IT_UPDATE); /* ÔÊÐí¸üÐÂÖÐ¶Ï */
HAL_TIM_PWM_Start(&g_timx_npwm_chy_handle, ATIM_TIMX_NPWM_CHY); /* ¿ªÆô¶ÔÓ¦PWMͨµÀ */
}
/**
* @brief ¸ß¼¶¶¨Ê±Æ÷TIMX NPWMÉèÖÃPWM¸öÊý
* @param rcr: PWMµÄ¸öÊý, 1~2^32´Î·½¸ö
* @retval ÎÞ
*/
void atim_timx_npwm_chy_set(uint32_t npwm)
{
if (npwm == 0) return;
g_npwm_remain = npwm; /* ±£´æÂö³å¸öÊý */
HAL_TIM_GenerateEvent(&g_timx_npwm_chy_handle, TIM_EVENTSOURCE_UPDATE); /* ²úÉúÒ»´Î¸üÐÂʼþ,ÔÚÖжÏÀïÃæ´¦ÀíÂö³åÊä³ö */
__HAL_TIM_ENABLE(&g_timx_npwm_chy_handle); /* ʹÄܶ¨Ê±Æ÷TIMX */
}
/**
* @brief ¸ß¼¶¶¨Ê±Æ÷TIMX NPWMÖжϷþÎñº¯Êý
* @param ÎÞ
* @retval ÎÞ
*/
void ATIM_TIMX_NPWM_IRQHandler(void)
{
uint16_t npwm = 0;
/* ÒÔÏ´úÂëûÓÐʹÓö¨Ê±Æ÷HAL¿â¹²Óô¦Àíº¯ÊýÀ´´¦Àí£¬¶øÊÇÖ±½Óͨ¹ýÅжÏÖжϱê־λµÄ·½Ê½ */
if(__HAL_TIM_GET_FLAG(&g_timx_npwm_chy_handle, TIM_FLAG_UPDATE) != RESET)
{
if (g_npwm_remain >= 256) /* »¹ÓдóÓÚ256¸öÂö³åÐèÒª·¢ËÍ */
{
g_npwm_remain = g_npwm_remain - 256;
npwm = 256;
}
else if (g_npwm_remain % 256) /* »¹ÓÐλÊý£¨²»µ½256£©¸öÂö³åÒª·¢ËÍ */
{
npwm = g_npwm_remain % 256;
g_npwm_remain = 0; /* ûÓÐÂö³åÁË */
}
if (npwm) /* ÓÐÂö³åÒª·¢ËÍ */
{
ATIM_TIMX_NPWM->RCR = npwm - 1; /* ÉèÖÃÖظ´¼ÆÊý¼Ä´æÆ÷ֵΪnpwm-1, ¼´npwm¸öÂö³å */
HAL_TIM_GenerateEvent(&g_timx_npwm_chy_handle, TIM_EVENTSOURCE_UPDATE); /* ²úÉúÒ»´Î¸üÐÂʼþ,ÔÚÖжÏÀïÃæ´¦ÀíÂö³åÊä³ö */
__HAL_TIM_ENABLE(&g_timx_npwm_chy_handle); /* ʹÄܶ¨Ê±Æ÷TIMX */
}
else
{
ATIM_TIMX_NPWM->CR1 &= ~(1 << 0); /* ¹Ø±Õ¶¨Ê±Æ÷TIMX£¬Ê¹ÓÃHAL Disable»áÇå³ýPWMͨµÀÐÅÏ¢£¬´Ë´¦²»Óà */
}
__HAL_TIM_CLEAR_IT(&g_timx_npwm_chy_handle, TIM_IT_UPDATE); /* Çå³ý¶¨Ê±Æ÷Òç³öÖжϱê־λ */
}
}