发新帖我要提问
12
返回列表
打印
[MCU]

430控制PWM

[复制链接]
楼主: jiaxw
手机看帖
扫描二维码
随时随地手机跟帖
21
zwll| | 2020-7-25 20:48 | 只看该作者 回帖奖励 |倒序浏览
电压控制是什么方式

使用特权

评论回复
22
renyaq| | 2020-7-25 20:59 | 只看该作者
是电压大小吗?

使用特权

评论回复
23
jlyuan| | 2020-7-25 21:02 | 只看该作者
这个没有代码可以参考吗

使用特权

评论回复
24
tian111| | 2020-7-25 21:05 | 只看该作者
那就需要DAC输出的。

使用特权

评论回复
25
kangzj| | 2020-7-25 21:12 | 只看该作者
具体描述你要实现的功能

使用特权

评论回复
26
tian111| | 2020-7-25 21:18 | 只看该作者
你得说明输入信号是什么

使用特权

评论回复
27
zhuww| | 2020-7-25 21:21 | 只看该作者
就是控制占空比。

使用特权

评论回复
28
huanghuac| | 2020-7-25 21:24 | 只看该作者
要PWM的的源代码吗?

使用特权

评论回复
29
songqian17| | 2020-7-25 21:27 | 只看该作者
msp430自带dac输出信号。

使用特权

评论回复
30
zwll| | 2020-7-25 21:30 | 只看该作者
做个占空比可调节的PWM

使用特权

评论回复
31
chuxh| | 2020-7-25 21:34 | 只看该作者

USART串口使用
STM8L上有多个串口,最多可达5个,分别为USART1~USART5,但依据型号不同,搭载数量并不相同。
以STM8L052R8为例,其只具有USART1~USART3。
因为STM8系列功能众多,很多Pin都是复用的,因此使用前必须检查STML的参考手册。
通过手册可知,以USART1为例,RX/TX可以使用以下的管脚,默认是PC2/PC3,
如果要变更,需要修改SYSCFG remap control register 1 (SYSCFG_RMPCR1)的5:4位进行切换。

Bits 5:4 USART1TR_REMAP[1:0]: USART1_TX and USART1_RX remapping
00: USART1_TX on PC3 and USART1_RX on PC2
01: USART1_TX on PA2 and USART1_RX on PA3
10: USART1_TX on PC5 and USART1_RX on PC6
11: Reserved

初始化:

    // USART init
    USART_DeInit(USART1);  

    // PC2-RX PC3-TX 端口上拉
    GPIO_ExternalPullUpConfig(GPIOC, GPIO_Pin_2 | GPIO_Pin_3, ENABLE);

    // 初始化参数
    USART_Init(USART1,
                (uint32_t)9600,
                USART_WordLength_8b,
                USART_StopBits_1,
                USART_Parity_No,
                USART_Mode_Rx | USART_Mode_Tx);  // 允许读和写

    // 开中断
    // 一般需要写时再开写中断,否则写中断会非常频繁以至于始终在执行中断
    // 读中断看具体业务
    //USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);   
    //USART_ITConfig(USART1, USART_IT_TC, ENABLE);

    /* Enable USART 使能 */
    USART_Cmd(USART1, ENABLE);

关闭串口

    GPIO_ExternalPullUpConfig(GPIOC, GPIO_Pin_2 | GPIO_Pin_3, DISABLE);
    USART_Cmd(USART1, DISABLE );
    USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
    USART_ITConfig(USART1, USART_IT_TC, DISABLE);

读写处理(异步)

void uart_begin_read(uint8_t len)
{
    // prepare send data
    USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);

    // 初始化读缓冲
    read_idx = 0;
    read_len = len;

    // 开始读(开读中断)
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}

void uart_begin_write(uint8_t* data, uint8_t len)
{
    // prepare send data
    USART_ITConfig(USART1, USART_IT_TC, DISABLE);

    // 初始化写缓冲(复制待写数据等)
    memcpy(writ_buffer, data, len);
    writ_idx = 0;
    writ_len = len;

    // 开始写(开写中断)
    USART_ITConfig(USART1, USART_IT_TC, ENABLE);

    return;
}

中断处理

// 写中断处理
INTERRUPT_HANDLER(USART1_TX_TIM5_UPD_OVF_TRG_BRK_IRQHandler, 27)
{
    // 发送1字节
    USART_SendData8(USART1, writ_buffer[writ_idx++]);
    USART_ClearITPendingBit(USART1, USART_IT_TC);

    // 等待缓冲数据全部写出后,关写中断
    if( writ_idx == writ_len ) {
        USART_ITConfig(USART1, USART_IT_TC, DISABLE);
        // 你的处理
    }
}

// 读中断处理
INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler, 28)
{
    uint8_t temp = 0;

    // 读1字节,存入读缓区
    temp = USART_ReceiveData8(USART1);
    read_buffer[read_idx++] = temp;

    // 等待全部读完后(如果有设定读长度的话)关读中断
    // 这里根据具体业务,可以不关中断一直接受数据
    if( read_idx == read_len ) {
        USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
    }
}

上面示例是异步读写,加一个状态等待的循环判断,可改为同步读写。

使用特权

评论回复
32
pengf| | 2020-7-25 21:37 | 只看该作者
电压控制不是很简单吗?

使用特权

评论回复
33
yinxiangh| | 2020-7-25 21:40 | 只看该作者

/*定时器输出单元举例:
ACLK时钟频率为LFXT1=32768Hz,利用Timer_A输出周期为512/32768
=15.625ms,占空比分别为75%和25%的PWM波
*/
#include "io430.h"
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
    TACTL=TASSEL_1+TACLR;
    CCR0=512-1;//PWM周期
    CCTL1=OUTMOD_7;
    CCR1=384;//384/512=0.75
    CCTL2=OUTMOD_7;
    CCR2=128;//占空比128/512=0.25
    P1DIR|=BIT2;
    P1SEL|=BIT2;
    P2DIR|=BIT0;
    P2SEL|=BIT0;
    TACTL|=MC_1;//增计数模式
    while(1)
    {
        LPM3;
    }
  return 0;
}

使用特权

评论回复
34
yinxiangh| | 2020-7-25 21:43 | 只看该作者
PWM的C语言就可以实现。

使用特权

评论回复
35
jiaxw|  楼主 | 2020-7-25 21:48 | 只看该作者

其实还是不大明白,我再琢磨琢磨吧,多谢了哈先

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则