{"id":687,"date":"2025-06-05T13:04:21","date_gmt":"2025-06-05T05:04:21","guid":{"rendered":"\/?p=687"},"modified":"2025-06-05T13:40:22","modified_gmt":"2025-06-05T05:40:22","slug":"%e8%84%89%e5%ae%bd%e8%b0%83%e5%88%b6","status":"publish","type":"post","link":"\/?p=687","title":{"rendered":"\u8109\u5bbd\u8c03\u5236\u2014\u2014\u6b63\u5f26\u6ce2"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\u5b9e\u73b0\u65b9\u6cd5\uff1a<\/h2>\n\n\n\n<p>\u901a\u8fc7\u4e0d\u540c\u5360\u7a7a\u6bd4\u7684\u65b9\u6ce2\u4fe1\u53f7\u7ecf\u8fc7<strong>RC\u4f4e\u901a\u6ee4\u6ce2<\/strong>\u5b9e\u73b0\u6b63\u5f26\u6ce2\u6548\u679c<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/06\/Snipaste_2025-06-05_13-38-03.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"933\" height=\"666\" data-original=\"\/wp-content\/uploads\/2025\/06\/Snipaste_2025-06-05_13-38-03.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-690\"  sizes=\"(max-width: 933px) 100vw, 933px\" \/><\/div><\/figure>\n\n\n\n<p>\u7531generate_sine_pwm_values\u51fd\u6570\u4ea7\u751f\u6240\u9700\u5360\u7a7a\u6bd4\u6570\u636e<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\/**\n * @brief \u751f\u6210\u6b63\u5f26\u6ce2\u5bf9\u5e94\u7684PWM\u5360\u7a7a\u6bd4\u5e8f\u5217\n * @param arr \u81ea\u52a8\u91cd\u88c5\u8f7d\u503c\uff08\u51b3\u5b9aPWM\u5468\u671f\uff09\n * @param amplitude \u6b63\u5f26\u6ce2\u5e45\u5ea6\u7cfb\u6570\uff080.0~0.5\uff0c\u5efa\u8bae0.3\uff09\n * @param ccr_values \u8f93\u51fa\u6570\u7ec4\uff0c\u5b58\u50a8\u8ba1\u7b97\u540e\u7684CCR\u5bc4\u5b58\u5668\u503c\n * @param n \u91c7\u6837\u70b9\u6570\uff08\u9ed8\u8ba4100\uff09\n * @note \u5360\u7a7a\u6bd4\u8303\u56f4\uff1a0.5\u00b1amplitude\uff08\u907f\u514d0%\/100%\u5931\u771f\uff09\n *\/\nvoid generate_sine_pwm_values(uint16_t arr, float amplitude, uint16_t *ccr_values, uint16_t n) {\n    for (uint16_t i = 0; i &lt; n; i++) {\n        \/\/ \u8ba1\u7b97\u6b63\u5f26\u6ce2\u89d2\u5ea6\uff080~2\u03c0\uff09\n        float angle = 2 * M_PI * i \/ n;\n        \n        \/\/ \u8ba1\u7b97\u5360\u7a7a\u6bd4\uff1a0.5 + \u5e45\u5ea6*sin(\u89d2\u5ea6)\n        float duty_cycle = 0.5f + amplitude * sinf(angle);\n        \n        \/\/ \u6620\u5c04\u5230CCR\u5bc4\u5b58\u5668\u503c\uff08\u5360\u7a7a\u6bd4 * ARR\uff09\n        ccr_values&#91;i] = (uint16_t)(duty_cycle * arr);\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u5b8c\u6574\u4ee3\u7801\uff1a<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>#include \"stm32f10x.h\"                  \/\/ Device header\n#include \"math.h\"\n#include &lt;stdint.h>\n#define GA GPIOA\n#define GP GPIO_Pin_0\n#ifndef M_PI\n#define M_PI 3.14159265358979323846\n#endif\n#define pfreq 20000   \/\/\u5b9e\u9645\u9700\u8981\u6b63\u5f26\u7684\u9891\u7387\n#define SINE_POINTS 25  \/\/ \u6b63 \u5f26\u6ce2\u91c7\u6837\u70b9\u6570\n#define pp pfreq*SINE_POINTS  \/\/\u5b9e\u9645\u9700\u8981\u7684\u9891\u7387\n#define psc 1      \/\/\u9884\u5206\u9891\u7cfb\u6570\uff0c\u4f4e\u7684\u8bdd\u5206\u8fa8\u7387\u9ad8\n\n\n\n\/\/ \u6b63\u5f26\u6ce2\u67e5\u627e\u8868\nuint16_t sineTable&#91;SINE_POINTS];\nunsigned char status = 0;\nuint32_t ARRPeriod   = (72000000 \/ (pp*psc)) - 1; \/\/\u9700\u8981\u9891\u7387\u7684arr\u503c\n\n\n\/**\n * @brief \u751f\u6210\u6b63\u5f26\u6ce2\u5bf9\u5e94\u7684PWM\u5360\u7a7a\u6bd4\u5e8f\u5217\n * @param arr \u81ea\u52a8\u91cd\u88c5\u8f7d\u503c\uff08\u51b3\u5b9aPWM\u5468\u671f\uff09\n * @param amplitude \u6b63\u5f26\u6ce2\u5e45\u5ea6\u7cfb\u6570\uff080.0~0.5\uff0c\u5efa\u8bae0.3\uff09\n * @param ccr_values \u8f93\u51fa\u6570\u7ec4\uff0c\u5b58\u50a8\u8ba1\u7b97\u540e\u7684CCR\u5bc4\u5b58\u5668\u503c\n * @param n \u91c7\u6837\u70b9\u6570\uff08\u9ed8\u8ba4100\uff09\n * @note \u5360\u7a7a\u6bd4\u8303\u56f4\uff1a0.5\u00b1amplitude\uff08\u907f\u514d0%\/100%\u5931\u771f\uff09\n *\/\nvoid generate_sine_pwm_values(uint16_t arr, float amplitude, uint16_t *ccr_values, uint16_t n) {\n    for (uint16_t i = 0; i &lt; n; i++) {\n        \/\/ \u8ba1\u7b97\u6b63\u5f26\u6ce2\u89d2\u5ea6\uff080~2\u03c0\uff09\n        float angle = 2 * M_PI * i \/ n;\n        \n        \/\/ \u8ba1\u7b97\u5360\u7a7a\u6bd4\uff1a0.5 + \u5e45\u5ea6*sin(\u89d2\u5ea6)\n        float duty_cycle = 0.5f + amplitude * sinf(angle);\n        \n        \/\/ \u6620\u5c04\u5230CCR\u5bc4\u5b58\u5668\u503c\uff08\u5360\u7a7a\u6bd4 * ARR\uff09\n        ccr_values&#91;i] = (uint16_t)(duty_cycle * arr);\n    }\n}\n\nvoid PwmInit(void){\n\n\tgenerate_sine_pwm_values(ARRPeriod,0.3,sineTable,SINE_POINTS);\n\t\n\tRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);\n\tRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);\n\t\n\n\tTIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;\n\n\tTIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;\n\tTIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;\n\tTIM_TimeBaseInitStruct.TIM_Period =ARRPeriod;\n\tTIM_TimeBaseInitStruct.TIM_Prescaler = psc-1;\n\tTIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;\n\tTIM_TimeBaseInit(TIM2,&amp;TIM_TimeBaseInitStruct);\n\t\n\tTIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);\t\t\t\n\n\tNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);\t\t\t\t\n\tNVIC_InitTypeDef NVIC_InitStructure;\t\t\t\n\tNVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;\t\t\t\t\n\tNVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;\t\t\t\n\tNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;\t\n\tNVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;\t\t\t\n\tNVIC_Init(&amp;NVIC_InitStructure);\t\t\t\t\t\t\t\n\n\tGPIO_InitTypeDef GPIO_InitStruct;\n\tGPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;\n\tGPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;\n\tGPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;\n\tGPIO_Init(GA,&amp;GPIO_InitStruct);\n\/\/\tGPIO\n\t\n\tTIM_OCInitTypeDef TIM_OCInitStruct;\n\tTIM_OCStructInit(&amp;TIM_OCInitStruct);\n\tTIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;\n\tTIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;\n\tTIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;\n\tTIM_OCInitStruct.TIM_Pulse = 0;\n\tTIM_OC2Init(TIM2,&amp;TIM_OCInitStruct);\n\n\tTIM_Cmd(TIM2,ENABLE);\n\n\t\n}\n\n\nvolatile uint16_t sineIndex = 0;\nvoid TIM2_IRQHandler(void)\n{\n    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)\n    {\n        \/\/ \u66f4\u65b0PWM\u5360\u7a7a\u6bd4\n\t\t\tuint8_t hol = 0;\n\t\t\tTIM_SetCompare2(TIM2, sineTable&#91;sineIndex]);\n\t\t\tsineIndex++;\n      if (sineIndex >= SINE_POINTS)\n       {\n\t\t\t\t\tsineIndex=0;\n\t\t\t }\n        \/\/ \u6e05\u9664\u4e2d\u65ad\u6807\u5fd7\u4f4d\n        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);\n    }\n}\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u5b9e\u73b0\u65b9\u6cd5\uff1a \u901a\u8fc7\u4e0d\u540c\u5360\u7a7a\u6bd4\u7684\u65b9\u6ce2\u4fe1\u53f7\u7ecf\u8fc7RC\u4f4e\u901a\u6ee4\u6ce2\u5b9e\u73b0\u6b63\u5f26\u6ce2\u6548\u679c \u7531generate_sine_pwm_va [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[31],"tags":[],"class_list":["post-687","post","type-post","status-publish","format-standard","hentry","category-31"],"_links":{"self":[{"href":"\/index.php?rest_route=\/wp\/v2\/posts\/687"}],"collection":[{"href":"\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=687"}],"version-history":[{"count":4,"href":"\/index.php?rest_route=\/wp\/v2\/posts\/687\/revisions"}],"predecessor-version":[{"id":692,"href":"\/index.php?rest_route=\/wp\/v2\/posts\/687\/revisions\/692"}],"wp:attachment":[{"href":"\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=687"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=687"},{"taxonomy":"post_tag","embeddable":true,"href":"\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=687"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}