adc采样控制pwm的问题

2019-07-24 17:29发布

我现在需要的功能是:在某一时间后,采样电压,然后超过目标值就驱动电机调压,到了目标值就停止,如果小于目标值就反向调压。
我用的TI的TIVA系列单片机,ADC采样和PWM输出我都可以实现,但是联动起来就有些问题。
TI的函数里都是unsigned int32 定义的变量,我用采样值减去目标值得到一个差值,利用差值的正负、大小,判断是否需要调压,因为有三相,所以for循环三次
遇到了几个问题
1.无法反转和停止,差值恒大于128,我想应该是无符号数不会小于0的错误,但是我如果count定义成有符号的,TI的函数里ADC0_Value是个无符号数,貌似没法相减得到有符号数。可以吗?
2.恒为高电平的PWM总是参杂着很短时间的低电平,我想是不是采样值在临界值左右时刻变化,导致的pwm时开时关。但是我调节电压,低电平一直存在。鉴于第一个问题,无法实现电压变化控制PWM的通断,低电平一直存在倒也不能说明什么。
3.不知道要实现这个功能,该用什么方式避免采样波动引起的边界问题?
for(a=0;a<3;a++)
        {
                count=ADC0_Value[a]-goal;
                PWM_CTRL(count,a);
        }//把三相电压ADC0、ADC1、ADC2和目标值的差值计算出来
        a=0;


void PWM_CTRL(uint32_t count,uint8_t a)//控制三相电机的启动、停止、正反转
{
        if(a==0)
        {
                if(count>=128)
                {S0=4800;S1=0; PWMOutputState(PWM0_BASE, (PWM_OUT_0_BIT |PWM_OUT_1_BIT), true);}//正转
                else if(0<count<128)
                {PWMOutputState(PWM0_BASE, (PWM_OUT_0_BIT |PWM_OUT_1_BIT), false);}//不转
                else
                {S0=0;S1=4800; PWMOutputState(PWM0_BASE, (PWM_OUT_0_BIT |PWM_OUT_1_BIT), true);}//反转
        }
        if(a==1)
        {
                if(count>=128)
                {S2=4800;S3=0; PWMOutputState(PWM0_BASE, (PWM_OUT_2_BIT |PWM_OUT_3_BIT), true);}//正转
                else if(0<count<128)
                {PWMOutputState(PWM0_BASE, (PWM_OUT_2_BIT |PWM_OUT_3_BIT), false);}//不转
                else
                {S2=0;S3=4800; PWMOutputState(PWM0_BASE, (PWM_OUT_2_BIT |PWM_OUT_3_BIT), true);}//反转
        }
        if(a==2)
        {
                if(count>=128)
                {S4=4800;S5=0; PWMOutputState(PWM0_BASE, (PWM_OUT_4_BIT |PWM_OUT_5_BIT), true);}//正转
                else if(0<count<128)
                {PWMOutputState(PWM0_BASE, (PWM_OUT_4_BIT |PWM_OUT_5_BIT), false);}//不转
                else
                {S4=0;S5=4800; PWMOutputState(PWM0_BASE, (PWM_OUT_4_BIT |PWM_OUT_5_BIT), true);}//反转
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
djz1992
1楼-- · 2019-07-25 13:54
dirtwillfly 发表于 2015-12-29 11:20
2、未连接的io,一般都是悬空状态,会有感应电压存在,采样值随感应电压变化 ...

那您建议如何提高采样精度呢?多次采样取平均么
dirtwillfly
2楼-- · 2019-07-25 16:14
djz1992 发表于 2015-12-29 12:28
那您建议如何提高采样精度呢?多次采样取平均么


没看到你的电路,不清楚具体什么原因导致的采样不稳。要找出具体原因,有针对地采取措施
djz1992
3楼-- · 2019-07-25 18:13
 精彩回答 2  元偷偷看……
dirtwillfly
4楼-- · 2019-07-25 19:00
djz1992 发表于 2015-12-29 12:42
就是直接从函数信号发生器接到PE3,ADC0上,中间没有任何电路

PE3脚采样值是多少啊?波动也很大吗?
djz1992
5楼-- · 2019-07-25 20:48
dirtwillfly 发表于 2015-12-29 12:46
PE3脚采样值是多少啊?波动也很大吗?

对啊  一直接的1.65V  照理说应该是2048,采到的是1900,再运行一遍又变成1200,差的很多
dirtwillfly
6楼-- · 2019-07-25 23:09
djz1992 发表于 2015-12-29 12:53
对啊  一直接的1.65V  照理说应该是2048,采到的是1900,再运行一遍又变成1200,差的很多 ...

有可能adc配置不有问题,方便的话建议把代码传上来

一周热门 更多>